gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:07:15 25 4
gpt4 key购买 nike

我不确定我应该如何尝试反序列化一些如下所示的 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. number 可以是整数或 float 。我应该将其表示为枚举吗?
  2. 大数 1548091093000 是自 UNIX 纪元以来的毫秒数(相当于 Monday, January 21, 2019 5:18:13 PM)。因为我有日期(使用纪元)和数字,所以如果不访问“标题”描述,我无法轻易区分它们...
  3. 我正在使用 restson调用返回上面 JSON 的 REST API。 restson 将使用最终类型调用 serde_json::from_str()。这意味着该类型必须实现 Deserialize

我如何反序列化它?

最佳答案

您的数据完全是动态的,这意味着您无法使用任何不错的工具,例如派生 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com