反序列化 json 文件时出现 Serde 丢失字段错误
Serde missing field error when deserializing json file
我似乎无法理解为什么会出现此错误。
我遵循的 docs 是不是错了?
这是我遇到的错误,它发生在结构中除映射之外的所有字段中:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("missing field `link`", line: 10, column: 1)', src\main.rs:22:47
这是我的main.rs
use serde_json::{self, Value};
use std::{fs, collections::HashMap};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct Init {
link: String,
page: String,
pageid: u16,
update_timestamp: u16,
#[serde(flatten)]
char_page_info: HashMap<String, Value>
}
fn main() {
let data = fs::read_to_string("init.json").expect("Unable to read file");
println!("{}", data);
let p: Init = serde_json::from_str(&data).unwrap();
println!("{:#?}", p.char_page_info);
}
这是init.json
{
"char_page_info": [
{
"link": "",
"page": "GGST/Jack-O/Frame_Data",
"pageid": 27121,
"update_timestamp": 0
}
]
}
如果我删除 link: String,
page: String,
pageid: u16,
update_timestamp: u16,
它不会抛出任何错误并且反序列化时不会出现任何问题。
谁能给我解释一下这是为什么?
不只是缺少 link
:Serde 在第一个错误时放弃。 link
、page
、pageid
、update_timestamp
都不见了。 Serde 在顶级对象上查找这些字段,但没有找到它们,因为那里唯一存在的键是 char_page_info
。由于 char_page_info
可以有多个值(它是一个数组),因此您的 struct
无法正确建模基础数据。通过对数据进行充分建模,我们可以得到预期的结果:
#[derive(Serialize, Deserialize, Debug)]
struct Init {
link: String,
page: String,
pageid: u16,
update_timestamp: u16,
}
#[derive(Serialize, Deserialize, Debug)]
struct Data {
char_page_info: Vec<Init>,
}
let data = r#"{
"char_page_info": [
{
"link": "",
"page": "GGST/Jack-O/Frame_Data",
"pageid": 27121,
"update_timestamp": 0
}
]
}"#;
println!("{}", data);
let p: Data = serde_json::from_str(&data).unwrap();
println!("{:#?}", p.char_page_info);
我似乎无法理解为什么会出现此错误。
我遵循的 docs 是不是错了?
这是我遇到的错误,它发生在结构中除映射之外的所有字段中:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("missing field `link`", line: 10, column: 1)', src\main.rs:22:47
这是我的main.rs
use serde_json::{self, Value};
use std::{fs, collections::HashMap};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug)]
struct Init {
link: String,
page: String,
pageid: u16,
update_timestamp: u16,
#[serde(flatten)]
char_page_info: HashMap<String, Value>
}
fn main() {
let data = fs::read_to_string("init.json").expect("Unable to read file");
println!("{}", data);
let p: Init = serde_json::from_str(&data).unwrap();
println!("{:#?}", p.char_page_info);
}
这是init.json
{
"char_page_info": [
{
"link": "",
"page": "GGST/Jack-O/Frame_Data",
"pageid": 27121,
"update_timestamp": 0
}
]
}
如果我删除 link: String,
page: String,
pageid: u16,
update_timestamp: u16,
它不会抛出任何错误并且反序列化时不会出现任何问题。
谁能给我解释一下这是为什么?
不只是缺少 link
:Serde 在第一个错误时放弃。 link
、page
、pageid
、update_timestamp
都不见了。 Serde 在顶级对象上查找这些字段,但没有找到它们,因为那里唯一存在的键是 char_page_info
。由于 char_page_info
可以有多个值(它是一个数组),因此您的 struct
无法正确建模基础数据。通过对数据进行充分建模,我们可以得到预期的结果:
#[derive(Serialize, Deserialize, Debug)]
struct Init {
link: String,
page: String,
pageid: u16,
update_timestamp: u16,
}
#[derive(Serialize, Deserialize, Debug)]
struct Data {
char_page_info: Vec<Init>,
}
let data = r#"{
"char_page_info": [
{
"link": "",
"page": "GGST/Jack-O/Frame_Data",
"pageid": 27121,
"update_timestamp": 0
}
]
}"#;
println!("{}", data);
let p: Data = serde_json::from_str(&data).unwrap();
println!("{:#?}", p.char_page_info);