如何使用 serde_json 和 Value 枚举处理可能缺失的字段?
How to handle potentially missing fields using serde_json and the Value enum?
我有一个 JSON 的数据流,其中一些 JSON 对象可能缺少某些字段或具有我事先不知道的字段。
我的解决方案是使用:
let v: Value = serde_json::from_str(data)?;
如何处理访问字段 stuff
?如果我知道它存在,我可以使用:
v["stuff"]
如何处理 stuff
不是我的数据中的字段?
通过 Value
的 Index
实现(即 v["stuff"]
)访问缺失的字段,如果该字段不存在,将会出现恐慌。相反,使用 Value::get
, which returns an Option
:
if let Some(field) = v.get("stuff") {
println!("field = {:?}", field);
} else {
println!("field is missing");
}
My solution is to use [serde_json::Value
]
我仍然会使用类型驱动的序列化,将可能缺失的字段包装在 Option
中。
use serde::Deserialize; // 1.0.101
use serde_json; // 1.0.40
#[derive(Debug, Deserialize)]
struct Data {
required: i32,
missing: Option<String>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let data = r#"{"required": 42, "extra": true}"#;
let data = serde_json::from_str::<Data>(data)?;
println!("{:?}", data);
let data = r#"{"required": 42, "extra": true, "missing": "cow"}"#;
let data = serde_json::from_str::<Data>(data)?;
println!("{:?}", data);
Ok(())
}
Data { required: 42, missing: None }
Data { required: 42, missing: Some("cow") }
如果您有在编译时无法知道名称的字段,除了此解决方案之外,您还可以使用 serde_json::Value
。参见
另请参阅:
我有一个 JSON 的数据流,其中一些 JSON 对象可能缺少某些字段或具有我事先不知道的字段。
我的解决方案是使用:
let v: Value = serde_json::from_str(data)?;
如何处理访问字段 stuff
?如果我知道它存在,我可以使用:
v["stuff"]
如何处理 stuff
不是我的数据中的字段?
通过 Value
的 Index
实现(即 v["stuff"]
)访问缺失的字段,如果该字段不存在,将会出现恐慌。相反,使用 Value::get
, which returns an Option
:
if let Some(field) = v.get("stuff") {
println!("field = {:?}", field);
} else {
println!("field is missing");
}
My solution is to use [
serde_json::Value
]
我仍然会使用类型驱动的序列化,将可能缺失的字段包装在 Option
中。
use serde::Deserialize; // 1.0.101
use serde_json; // 1.0.40
#[derive(Debug, Deserialize)]
struct Data {
required: i32,
missing: Option<String>,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let data = r#"{"required": 42, "extra": true}"#;
let data = serde_json::from_str::<Data>(data)?;
println!("{:?}", data);
let data = r#"{"required": 42, "extra": true, "missing": "cow"}"#;
let data = serde_json::from_str::<Data>(data)?;
println!("{:?}", data);
Ok(())
}
Data { required: 42, missing: None }
Data { required: 42, missing: Some("cow") }
如果您有在编译时无法知道名称的字段,除了此解决方案之外,您还可以使用 serde_json::Value
。参见
另请参阅: