如何使用Serde反序列化JSON的顶层数组?

40

我有一些从web服务返回的JSON数据。JSON是一个顶级数组:

[
    {
        "data": "value1"
    },
    {
        "data": "value2"
    },
    {
        "data": "value3"
    }
]
使用 serde_derive 可以让我生成用于反序列化结构体中包含数据的代码,但是我无法使 Serde 对顶级数组进行反序列化。我是否漏掉了什么东西,或者 Serde 不能反序列化顶级数组?
1个回答

54

您可以简单地使用Vec

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
struct Foo {
    data: String,
}

fn main() -> Result<(), serde_json::Error> {
    let data = r#"[
        {
            "data": "value1"
        },
        {
            "data": "value2"
        },
        {
            "data": "value3"
        }
    ]"#;

    let datas: Vec<Foo> = serde_json::from_str(data)?;

    for data in datas.iter() {
        println!("{:#?}", data);
    }

    Ok(())
}

如果您愿意,您还可以使用transparent

#[derive(Serialize, Deserialize, Debug)]
#[serde(transparent)]
struct Foos {
    foos: Vec<Foo>,
}

let foos: Foos = serde_json::from_str(data)?;

这使得您可以将数据与您的类型封装在一起。


如果输入的JSON主体不是一个数组,有没有一般的方法来处理它?谢谢! - prehistoricpenguin
@prehistoricpenguin,这里没有更简单的方法了 https://github.com/serde-rs/json#parsing-json-as-strongly-typed-data-structures - Stargateur
谢谢,我在问题讨论中找到了答案。我们可以使用 let foos: serde_json::Value = serde_json::from_str(data)?; - prehistoricpenguin
但是如果这个文件大小为10GB,你如何高效地解析它呢? - R Sun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接