我正在编写一个 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
因为 Serde
有 Serialize
和 Deserialize
实现 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
。请参阅文档 here和 here了解更多详情。
关于json - 如何在 Serde 中(反)序列化强类型的 JSON 字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49717966/