gpt4 book ai didi

json - 根据 JSON 中的字段有条件地解码 JSON

转载 作者:行者123 更新时间:2023-11-29 07:47:55 27 4
gpt4 key购买 nike

我从 API 接收 JSON,响应可以是 30 种类型之一。每种类型都有一组唯一的字段,但所有响应都有一个字段 type 说明它是哪种类型。

我的方法是使用serde .我为每种响应类型创建一个结构并使它们可解码。一旦我有了这个,我该如何选择应该将哪个结构用于新收到的消息?

目前,我创建了另一个结构 TypeStruct,其中只有一个字段用于 type。我将 JSON 解码为 TypeStruct,然后根据类型值为接收到的消息选择合适的结构,然后再次解码消息。

我想摆脱这种解码重复。

最佳答案

您可以使用现有的枚举反序列化。我将逐步举例说明将您的格式反序列化为以下枚举:

#[derive(Debug, PartialEq, Eq, Deserialize)]
enum MyType {
A {gar: ()},
B {test: i32},
C {blub: String},
}
  1. 从一个示例 json 字符串开始:

    let json = r#"{"type": "B", "test": 42}"#;
  2. 把它变成一个Value枚举

    let mut json: serde_json::Value = serde_json::from_str(json).unwrap();
  3. 删除类型字段

    let type_ = {
    let obj = json.as_object_mut().expect("object");
    let type_ = obj.remove("type").expect("`type` field");
    if let serde_json::Value::String(s) = type_ {
    s
    } else {
    panic!("type field not a string");
    }
    };
  4. 创建“正确的”枚举 json。具有单个字段的结构,其中字段的名称是枚举变体,字段的值是变体值

    let mut enum_obj = std::collections::BTreeMap::new();
    enum_obj.insert(type_, json);
    let json = serde_json::Value::Object(enum_obj);
  5. 使用生成的 json 反序列化器将 json 转换为您的枚举值

    let obj: MyType = serde_json::from_value(json).unwrap();

关于json - 根据 JSON 中的字段有条件地解码 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33323891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com