大多数示例展示了使用 Rust 对 JSON 进行反序列化,并serde_json
使用定义的展示了反序列化为已知结构格式struct
。
是否可以将具有未知结构的 JSON 文档反序列化为可以处理这种结构变化的通用 Rust 数据类型?
例如,我尝试过这样的事情
let filename = "example.json";
let maybe_ifile = std::fs::File::open(filename);
match maybe_ifile {
Ok(ifile) => {
let maybe_json_data = serde_json::from_reader::<_, BTreeMap<String, String>>(ifile);
match maybe_json_data {
Ok(json_data) => {
println!("{json_data:?}");
}
Err(error) => {
panic!("{error}")
}
}
}
Err(error) => {
panic!("{error}");
}
}
如果 JSON 文档的结构为键值字符串对,则此方法有效,但对于更通用的结构则无效,因此显然使用BTreeMap<String, String>
这里的方法不是正确的方法。
我想要实现的是使用运行时/某种动态类型的灵活性。
在其他语言中这也是可能的,所以我认为 Rust 中有一个相当简单的解决方案,我只是不知道这是什么。
解决方案是使用
serde_json::Value
数据类型。这提供了一种处理 JSON 数据的通用方法。只改变一行:
反序列化通用 JSON 文档示例
下面是将 JSON 字符串反序列化为的示例
serde_json::Value
:解释
解析 JSON:serde_json::from_str 函数将 JSON 字符串解析为 serde_json::Value。
访问数据:使用
get
方法访问 JSON 中的字段。您还可以使用类型特定的方法(如as_str
、as_i64
和)as_bool
将 JSON 值转换为 Rust 类型。处理嵌套和复杂的 JSON
枚举
serde_json::Value
可以表示任意结构的 JSON 数据:Value::Object
对于 JSON 对象Value::Array
对于数组Value::String
对于字符串Value::Number
对于数字Value::Bool
对于布尔值Value::Null
为空这使得它适合于结构不固定时的通用 JSON 反序列化。