I have a some JSON data that is returned from a web service. The JSON is a top-level array:

[
    {
        "data": "value1"
    },
    {
        "data": "value2"
    },
    {
        "data": "value3"
    }
]

使用serde_derive生成struct,我可以反序列化数组中包含的数据,但是,我无法让Serde反序列化顶级array.

我是否遗漏了什么,或者Serde不能反序列化顶级数组?

推荐答案

You can simply use a 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(())
}

If you wish, you could also use transparent:

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

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

这允许用您的类型封装数据.

Json相关问答推荐

JOLT将对象名作为新属性添加到主体中

从先前的REST调用创建动态JSON主体

无法从JSON解析ZonedDateTime,但可以使用格式化程序很好地解析

在Reaction中从JSON文件中筛选数组

Postgres Select json数组并重新映射属性名称

PostgreSQL:删除 JSONB 数组中每个元素的特定键

在 PowerShell 中通过 aws cli 创建 cloudwatch alert 时出现字符串解析错误

如何使用jq按键 Select 并获取整个json输出来更改json中的多个值

如何使用 jq 将字符串数组转换为对象?

如何使用 jq 在连续的 json 记录流上调用操作

小写嵌套特定键的震动转换

数据清理设计不良的 JSON 数据 - 需要有关最佳策略的建议

在 PostgreSQL 中 Select 分层 JSON 作为表

Kotlin Android Room 处理 Moshi TypeConverter 中的空对象列表

Spring MVC控制器中的JSON参数

如何判断 JSON 响应元素是否为数组?

将循环 struct 转换为 JSON - 有什么方法可以找到它抱怨的字段?

POST:在 url 本身中发送 post 请求

带有 Jackson 的不可变 Lombok 注释类

Jersey 2.0 相当于 POJOMappingFeature