我从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);
let obj: MyType = serde_json::from_value(json).unwrap();