我正在编写一个Rust应用程序,它使用公共接口处理来自TypeScript客户端的JSON消息.我已经编写了一些代码serde_derive并且运行良好,但我无法弄清楚如何实现字典; 例如:
{
"foo" : { "data" : 42 },
"bar" : { "data" : 1337 }
}
Run Code Online (Sandbox Code Playgroud)
这里的键是字符串"foo","bar"字典的值遵循以下模式:
use serde_derive;
use serde_json::Number;
#[derive(Serialize, Deserialize)]
struct DictionaryValue {
data: Number,
}
Run Code Online (Sandbox Code Playgroud)
我希望以这种方式访问JSON数据:
#[derive(Serialize, Deserialize)]
struct Dictionary {
key: String,
value: DictionaryValue,
}
Run Code Online (Sandbox Code Playgroud)
我如何(de)Dictionary使用Serde 将我的JSON数据序列化为/从?
您的代码中存在逻辑错误.JSON文件中的结构描述了一个关联数组,但您Dictionary不支持多个键值对.作为Stargateur在评论中指出,你可以使用HashMap作为 Serde具有Serialize和Deserialize实现的HashMap.
您可以重写Dictionaryas ,而不是使用单个键值对
type Dictionary = HashMap<String, DictionaryValue>;
Run Code Online (Sandbox Code Playgroud)
并且您可以检索数据,例如
let dict: Dictionary = serde_json::from_str(json_string).unwrap();
Run Code Online (Sandbox Code Playgroud)
如果你现在想要在Dictionary-struct中包装所有内容,它将如下所示:
#[derive(Serialize, Deserialize)]
struct Dictionary {
inner: HashMap<String, DictionaryValue>,
}
Run Code Online (Sandbox Code Playgroud)
问题是,serde_json现在预计
{
"inner": {
"foo" : { "data" : 42 },
"bar" : { "data" : 1337 }
}
}
Run Code Online (Sandbox Code Playgroud)
要摆脱这种情况,您可以将serde(flatten) 属性添加到Dictionary:
#[derive(Serialize, Deserialize, Debug)]
struct Dictionary {
#[serde(flatten)]
inner: HashMap<String, DictionaryValue>,
}
Run Code Online (Sandbox Code Playgroud)
如果HashMap或者任何BTreeMap来自std不适合你的需求,你也可以实现你Dictionary对你自己的.有关更多详细信息,请参阅此处和此处的文档.
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |