json - 如何在 Serde 中(反)序列化强类型的 JSON 字典?

标签 json rust serde

我正在编写一个 Rust 应用程序,它使用公共(public)接口(interface)处理来自 TypeScript 客户端的 JSON 消息。我已经使用 serde_derive 编写了一些代码并且运行良好,但我不知道如何实现字典;例如:

{
  "foo" : { "data" : 42 },
  "bar" : { "data" : 1337 }
}

这里的键是字符串 "foo""bar" 并且字典的值遵循以下模式:

use serde_derive;
use serde_json::Number;

#[derive(Serialize, Deserialize)]
struct DictionaryValue {
    data: Number,
}

我希望以这种方式访问​​ JSON 数据:

#[derive(Serialize, Deserialize)]
struct Dictionary {
    key: String,
    value: DictionaryValue,
}

如何使用 Serde 将我的 JSON 数据(反)序列化到 Dictionary 中或从中序列化?

最佳答案

您的代码中存在逻辑错误。 JSON 文件中的结构描述了一个关联数组,但您的 Dictionary 不支持多个键值对。作为Stargateur stated in the comments , 你可以使用 HashMap因为 SerdeSerializeDeserialize 实现 HashMap .

您可以将 Dictionary 重写为

,而不是使用单个键值对
type Dictionary = HashMap<String, DictionaryValue>;

您可以通过以下方式检索数据

let dict: Dictionary = serde_json::from_str(json_string).unwrap();

如果您现在想将所有内容包装在 Dictionary-struct 中,它将如下所示:

#[derive(Serialize, Deserialize)]
struct Dictionary {
    inner: HashMap<String, DictionaryValue>,
}

问题是,serde_json 现在需要

{
  "inner": {
    "foo" : { "data" : 42 },
    "bar" : { "data" : 1337 }
  }
}

要摆脱这种情况,您可以添加 serde(flatten) attribute字典:

#[derive(Serialize, Deserialize, Debug)]
struct Dictionary {
    #[serde(flatten)]
    inner: HashMap<String, DictionaryValue>,
}

如果HashMap或任何 BTreeMap from std 不符合您的需求,您也可以自己实现您的 Dictionary。请参阅文档 herehere了解更多详情。

关于json - 如何在 Serde 中(反)序列化强类型的 JSON 字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49717966/

相关文章:

python - 如何在 python 中将列表列表(列表)转换为 json 数组?

javascript - 在 Node JS 中访问 JSON 的属性

io - 在文件夹中创建文件

rust - 来自Struct示例的Serde JSON无法正常工作

rust - 如何在 Rust 中使用 serde 为容器设置 "deserialize with"

rust - Visitor 特性如何只允许部分实现?

javascript - 如何有效地连接 2 个 json 文件的数据?

json - 什么是Erlang最成熟的JSON库?

rust - 我不明白错误 E0508

返回所有排列的函数