您可以使用现有的枚举反序列化.我将给出一个分步示例,将您的格式反序列化为以下枚举:
#[derive(Debug, PartialEq, Eq, Deserialize)]
enum MyType {
A {gar: ()},
B {test: i32},
C {blub: String},
}
Run Code Online (Sandbox Code Playgroud)
以示例json字符串开头:
let json = r#"{"type": "B", "test": 42}"#;
Run Code Online (Sandbox Code Playgroud)把它变成Value枚举
let mut json: serde_json::Value = serde_json::from_str(json).unwrap();
Run Code Online (Sandbox Code Playgroud)撕掉type场地
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");
}
};
Run Code Online (Sandbox Code Playgroud)创建"适当的"枚举json.具有单个字段的结构,其中字段的名称是枚举变体,字段的值是变量值
let mut enum_obj = std::collections::BTreeMap::new();
enum_obj.insert(type_, json);
let json = serde_json::Value::Object(enum_obj);
Run Code Online (Sandbox Code Playgroud)使用生成的json反序列化器将json转换为枚举值
let obj: MyType = serde_json::from_value(json).unwrap();
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
673 次 |
| 最近记录: |