我想解析表单的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,我需要做什么?
发布于 2019-10-31 03:11:43
结果发现解决方案比我想象的要简单得多。感谢Reddit上的/u/sfackler向我指出这一点。
在这个场景中,我不需要使用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);
}
}https://stackoverflow.com/questions/58635528
复制相似问题