Serde Stream Deserializer的类型不是serde_json :: Value

问题描述 投票:0回答:1

我想解析形式的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,我需要做什么?

json rust serde-json
1个回答
0
投票
在这种情况下,我不需要使用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); } }

© www.soinside.com 2019 - 2024. All rights reserved.