1

我想解析表单的 JSON 字符串

{
    "a": {
        "foo": "bar"
    },
    "b": {
        "foo": "baz"
    }
}

也就是说,在顶层有许多用逗号分隔的 JSON 对象。这些对象中的每一个都具有与其他对象相同的字段(即,我可以轻松地用单个 表示所有这些对象struct)。

由于 JSON 字符串中有几个这样的对象,我相信我应该使用 a serde_json::StreamDeserializer,尽管我对 Rust 比较陌生,serde特别是,所以如果这不是正确的方法,请指出正确的方向。

这段代码代表了我想要做的事情:

use serde_json::Deserializer;
use serde::Deserialize;

#[derive(Deserialize, Debug)]
struct Data {
    foo: String,
}

fn main() {
    let data = r#"{
        "a": {"foo": "bar"},
        "b": {"foo": "baz"}
    }"#;

    let stream = Deserializer::from_str(data).into_iter::<Data>();

    for value in stream {
        println!("{:?}", value.unwrap());
    }
}

我希望这段代码产生一些类似于Object({"a": Object({"foo": String("bar")}), "b": Object({"foo": String("baz")})}).

这是我看到的输出,如果我更改Deserializer::from_str(data).into_iter::<Data>();Deserializer::from_str(data).into_iter::<serde_json::Value>();.

相反,代码无法编译,出现错误Error("missing field 'foo'", line: 4, column: 5)

Data那么,为了将 JSON 反序列化为结构而不是 struct ,我需要做什么Value

4

1 回答 1

1

事实证明,解决方案比我想象的要简单得多。感谢 Reddit 上的 /u/sfackler 向我指出这一点

在这种情况下,我不需要使用StreamDeserializer; 相反,我可以将 JSON 解析为 aHashMap并从中提取我想要的值。

例如:

use serde::Deserialize;
use std::collections::HashMap;

#[derive(Deserialize, Debug)]
struct Data {
    foo: String,
}

fn main() {
    let data = r#"{
        "a": {"foo": "bar"},
        "b": {"foo": "baz"}
    }"#;

    let m: HashMap<String, Data> = serde_json::from_str(&data).unwrap();
    for (_key, val) in m {
        println!("{:?}", val);
    }
}
于 2019-10-31T03:11:43.200 回答