如何在具有可变键名的JSON对象上使用Serde JSON

8

我知道JSON值可以用于未知的JSON格式。

我所拥有的是一个大部分结构化的JSON对象,例如:

{
    "error": [],
    "result": {
        "NAME_X": {
            "prop_one": "something",
            "prop_two": "something",
            "decimals": 1,
            "more_decimals": 2
        },
        "NAME_A": {
            "prop_one": "test",
            "prop_two": "sdfsdf",
            "decimals": 2,
            "more_decimals": 5
        },
        "ARBITRARY": {
            "prop_one": "something else",
            "prop_two": "blah",
            "decimals": 3,
            "more_decimals": 6
        }
}

因此,具有prop_one、prop_two、decimals和more_decimals字段的内部对象具有清晰的结构,但外部名称字段/键(NAME_X、NAME_A、ARBITRARY)未事先知道。

最直接的方法是什么,以便我可以在内部结构上使用强类型变量/反序列化?我还需要捕获这些未知的名称字段。

1个回答

6
您可以反序列化为一个map,它的键将会是字符串("NAME_X"等):
use std::collections::HashMap;
use serde::Deserialize;
use serde_json::Result;

#[derive(Debug, Deserialize)]
struct InThing {
    prop_one: String,
    prop_two: String,
    decimals: u16,
    more_decimals: i32,
}
#[derive(Debug, Deserialize)]
struct OutThing {
    error: Vec<u8>,
    result: HashMap<String, InThing>,
}

fn main() {
    let data = r#"
        {
            "error": [],
            "result": {
                "NAME_X": {
                    "prop_one": "something",
                    "prop_two": "something",
                    "decimals": 1,
                    "more_decimals": 2
                },
                "NAME_A": {
                    "prop_one": "test",
                    "prop_two": "sdfsdf",
                    "decimals": 2,
                    "more_decimals": 5
                },
                "ARBITRARY": {
                    "prop_one": "something else",
                    "prop_two": "blah",
                    "decimals": 3,
                    "more_decimals": 6
                }
            }
        }
        "#;
    let thing: OutThing = serde_json::from_str(data).unwrap(); 
    dbg!(thing);
}

playground


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接