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

前端之家收集整理的这篇文章主要介绍了有条件地根据JSON中的字段解码JSON前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我从API接收 JSON,响应可以是30种类型之一.每种类型都有一组唯一的字段,但所有响应都有一个字段类型,表明它是哪种类型.

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

目前,我已经创建了另一个结构TypeStruct,只有一个类型的字段.我将JSON解码为TypeStruct,然后根据类型值为接收的消息选择适当的结构,并再次解码消息.

我想摆脱这种解码重复.

解决方法

您可以使用现有的枚举反序列化.我将给出一个分步示例,将您的格式反序列化为以下枚举:
#[derive(Debug,PartialEq,Eq,Deserialize)]
enum MyType {
    A {gar: ()},B {test: i32},C {blub: String},}

>以示例json字符串开头:

let json = r#"{"type": "B","test": 42}"#;

>把它变成Value枚举

let mut json: serde_json::Value = serde_json::from_str(json).unwrap();

>撕掉类型字段

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");
    }
};

>创建“适当的”枚举json.具有单个字段的结构,其中字段的名称是枚举变体,字段的值是变量值

let mut enum_obj = std::collections::BTreeMap::new();
enum_obj.insert(type_,json);
let json = serde_json::Value::Object(enum_obj);

>使用生成的json反序列化器将json转换为枚举值

let obj: MyType = serde_json::from_value(json).unwrap();
原文链接:https://www.f2er.com/js/150241.html

猜你在找的JavaScript相关文章