如何反序列化 JSON,其中值的类型在另一个字段中指定?

2024-02-25

我不确定应该如何尝试反序列化一些如下所示的 JSON:

{
    "columns": [
        {
            "name": "stringColumn",
            "type": "string"
        },
        {
            "name": "DateColumn",
            "type": "date"
        },
        {
            "name": "NumberColumn",
            "type": "number"
        }
    ],
    "data": [
        [
            "This is a string",
            1548091093000,
            123
        ]
    ]
}

The columns向量描述了元素内条目的类型和数量data向量。上面的示例可以转换为 CSV(忽略类型):

stringColumn,DateColumn,NumberColumn
"This is a string",1548091093000,123

一些额外的挑战:

  1. A number可以是整数或浮点数。我应该将它表示为枚举吗?
  2. 数量大1548091093000是的数量毫秒自 UNIX 纪元以来(相当于Monday, January 21, 2019 5:18:13 PM)。因为我有日期(使用纪元)和数字,所以如果无法访问“标题”描述,我无法轻松区分它们......
  3. 我正在使用restson https://crates.io/crates/restson调用返回上述 JSON 的 REST API。雷森会打电话serde_json::from_str()与最终类型。这意味着该类型必须实现Deserialize.

我怎样才能反序列化这个?


您的数据完全是动态的,这意味着您无法使用任何好的工具,例如派生Deserialize.

你需要使用serde_json::Value https://docs.rs/serde_json/1.0.36/serde_json/enum.Value.html,数据所有可能的 JSON 类型的枚举。不过,您可以派生固定结构的结构:

use serde_derive; // 1.0.84
use serde_json::{self, Value}; // 1.0.34 

static INPUT: &str = r#"
{
    "columns": [
        {
            "name": "stringColumn",
            "type": "string"
        },
        {
            "name": "DateColumn",
            "type": "date"
        },
        {
            "name": "NumberColumn",
            "type": "number"
        }
    ],
    "data": [
        [
            "This is a string",
            1548091093000,
            123
        ]
    ]
}
"#;

#[derive(Debug, serde_derive::Deserialize)]
struct Thing {
    columns: Vec<Column>,
    data: Vec<Vec<Value>>,
}

#[derive(Debug, serde_derive::Deserialize)]
struct Column {
    name: String,
    r#type: String,
}

fn main() {
    let data = serde_json::from_str::<Thing>(INPUT);
    println!("{:#?}", data)
}

数字可以是整数或浮点数

这已经由serde_json::Number https://docs.rs/serde_json/1.0.36/serde_json/struct.Number.html

也可以看看:

  • Serde 能否根据字段的值将 JSON 反序列化为一组类型中的一种? https://stackoverflow.com/q/53018165/155423
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何反序列化 JSON,其中值的类型在另一个字段中指定? 的相关文章

随机推荐