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

标签 json rust serde

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

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

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

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

一些额外的挑战:

  1. 数字可以是整数或 float 。我应该将其表示为枚举吗?
  2. 大数1548091093000是自UNIX纪元以来的毫秒数(相当于2019年1月21日星期一下午5:18:13)。因为我有日期(使用纪元)和数字,所以如果无法访问“标题”描述,我无法轻松区分它们......
  3. 我正在使用restson调用返回上述 JSON 的 REST API。 Restson 将使用最终类型调用 serde_json::from_str() 。这意味着该类型必须实现Deserialize

如何反序列化它?

最佳答案

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

您需要使用serde_json::Value ,数据所有可能的 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)
}

A number can be an integer or a float

这已由 serde_json::Number 处理

另请参阅:

关于json - 如何反序列化 JSON,其中值的类型在另一个字段中指定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54295107/

相关文章:

rust - 使用 Serde 序列化值时如何执行额外的数据库查询?

javascript - 未从 JSON 加载网格数据

javascript - JSON 可以工作,但在控制台中打印错误

rust - Rust 编译器使用什么算法来推断生命周期变量?

Rust 比较 Option<Vec<u8>> 和 Option<&[u8]>

rust - 使用 serde_yaml 解析 Rust 中的 yaml

xml - 无法使用 serde-xml-rs 解析带有可选元素的 XML

java - 从android studio中的mysql数据库检索图像

javascript - 将 JSON 从 Contentful 获取到 Mustache

rust - 如何使用PyO3在Rust代码中嵌入的Python代码中执行地板分割?