处理尾随逗号
由于尾随逗号的存在,问题中提供的输入数据不是有效的 JSON。如果您必须使用尾随逗号,那么传统的 serde_json crate 不适合您的需求,您可能希望将 serde_json 的所有用法替换为支持尾随逗号的 crate,如 the json5 crate。 json5 提供了一个类似于serde_json 的API,所以下面的答案仍然有效。
处理可以是多种类型的字段
处理具有多种可能值类型的 JSON 字段可以使用 enum 完成,该 enum 包含 String 或 Vec<String> 以及 #[serde(untagged)] 属性。参见 serde 官方文档中的Enum representations。
完整示例:
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]
#[serde(untagged)]
enum StringOrStringVec {
String(String),
Vec(Vec<String>)
}
#[derive(Debug, Serialize, Deserialize)]
struct MyObj {
keya: StringOrStringVec,
keyb: StringOrStringVec,
}
fn main() {
let input_json = r#"
{
"keya": "some string",
"keyb": ["some string", "some string"]
}
"#;
let my_obj: MyObj = serde_json::from_str(input_json).unwrap();
println!("{:?}", my_obj);
let input_json = r#"
{
"keya": ["some string", "some string"],
"keyb": "some string"
}
"#;
let my_obj: MyObj = serde_json::from_str(input_json).unwrap();
println!("{:?}", my_obj);
}
示例输出:
MyObj { keya: String("some string"), keyb: Vec(["some string", "some string"]) }
MyObj { keya: Vec(["some string", "some string"]), keyb: String("some string") }
See it in action on Rust Playground