我想将JSON数据字符串反序列化为具有多个字段的结构体,如果序列化数据的顺序与结构体中字段的顺序不匹配,则返回错误。
我已经通读了serde documentation,包括自定义序列化部分,但找不到解决方案。我想可能通过实现Deserializer
的字段名检查来强制执行严格的顺序,但我不完全确定。
以下是serde_json文档格式的示例:
#[derive(Serialize, Deserialize)]
struct Person {
name: String,
age: u8,
phones: Vec<String>,
}
let correct_order = r#"
{
"name": "John Doe",
"age": 43,
"phones": [
"+44 1234567",
"+44 2345678"
]
}"#;
// this deserializes correctly (no error)
let p: Person = serde_json::from_str(data)?;
let incorrect_order = r#"
{
"age": 43,
"phones": [
"+44 1234567",
"+44 2345678"
]
"name": "John Doe"
}"#;
// how to ensure this returns an error? (data fields out of order)
let p2: Person = serde_json::from_str(data)?;
1条答案
按热度按时间qij5mzcb1#
您可以通过提供一个自定义的
Deserialize
实现来实现这一点。对于JSON,
struct
反序列化的访问者函数是Visitor::visit_map()
。通常,结构体字段以给定的顺序访问(例如,当您使用#[derive(Deserialize)]
时)。我们只需编写访问者以确保字段以我们期望的严格顺序访问。这里有很多样板文件(通常隐藏在
#[derive(Deserialize)]
后面):Field
来反序列化struct字段,它有自己的Deserialize
实现。这是一个标准实现,我们在这里手工编写它。PersonVisitor
来提供我们的Visitor
trait实现。这部分是我们实际执行字段排序的地方。下面的代码是这样的:
打印此输出: