这个答案早于OP作为评论给出的额外要求,但由于额外的要求使其成为一个单独的问题,因此保持原样。
处理尾随逗号
由于每个右括号之前都存在尾随逗号,问题中提供的输入数据不是有效的 JSON}
。如果你must使用尾随逗号,然后使用常规serde_json
crate 不适合您的需求,您可能想要替换所有用法serde_json
带有支持尾随逗号的板条箱,例如the json5 crate https://crates.io/crates/json5. The json5
提供了一个类似于serde_json
,所以下面的答案仍然有效。
处理可以是多种类型的字段
处理具有多种可能值类型的 JSON 字段可以使用enum
持有一个String
or a Vec<String>
,与#[serde(untagged)]
属性。看枚举表示 https://serde.rs/enum-representations.html有关该属性的详细信息,请参阅 serde 的官方文档。
完整示例:
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") }