serde_json::Value 以外类型的 Serde 流反序列化器
Serde Stream Deserializer for a type other than serde_json::Value
我想解析 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
?
事实证明,解决方案比我想象的要简单得多。 Credit to /u/sfackler on Reddit for pointing this out to me.
在这种情况下,我不需要使用 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);
}
}
我想解析 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
?
事实证明,解决方案比我想象的要简单得多。 Credit to /u/sfackler on Reddit for pointing this out to me.
在这种情况下,我不需要使用 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);
}
}