我想解析形式的JSON字符串
{
"a": {
"foo": "bar"
},
"b": {
"foo": "baz"
}
}
即,在顶层,有许多JSON对象,以逗号分隔。每个对象都具有与其他对象相同的字段(即,我可以轻松地用单个struct
表示所有这些对象)。
由于JSON字符串中有多个这些对象,我相信我应该使用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)
所以,为了将JSON反序列化为Data
结构而不是Value
,我需要做什么?
StreamDeserializer
;相反,我可以将JSON解析为HashMap
并从中提取所需的值。例如:
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);
}
}