簡體   English   中英

反序列化 json 文件時 Serde 缺少字段錯誤

[英]Serde missing field error when deserializing json file

我似乎無法理解為什么會發生這個錯誤。

我是否按照文檔錯誤?

這是我得到的錯誤,除了 map 之外,結構中的所有字段都會發生這種情況:

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 在第一個錯誤時就放棄了。 linkpagepageid以及update_timestamp都丟失了。 Serde 在頂層 object 上查找這些字段,但沒有找到它們,因為那里唯一的鍵是char_page_info 由於char_page_info可以有多個值(它是一個數組),因此您的struct不會正確地 model 基礎數據。 通過對數據進行充分建模,我們可以得到預期的結果:

#[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); 

(操場)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM