首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于serde_json::Value以外类型的Stream反序列化器

用于serde_json::Value以外类型的Stream反序列化器
EN

Stack Overflow用户
提问于 2019-10-31 00:46:36
回答 1查看 563关注 0票数 1

我想解析表单的JSON字符串

代码语言:javascript
复制
{
    "a": {
        "foo": "bar"
    },
    "b": {
        "foo": "baz"
    }
}

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

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

此代码表示我想要做的事情:

代码语言:javascript
复制
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,我需要做什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-31 03:11:43

结果发现解决方案比我想象的要简单得多。感谢Reddit上的/u/sfackler向我指出这一点

在这个场景中,我不需要使用StreamDeserializer;相反,我可以将JSON解析成一个HashMap并从中提取我想要的值。

例如:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58635528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档