簡體   English   中英

在 rust 中從 API 反序列化 serde_json

[英]deserializing serde_json from API in rust

我正在嘗試從此端點https://prices.runescape.wiki/api/v1/osrs/latest抓取 JSON。

#[derive(Serialize, Deserialize, Debug)]
struct Latest {
    high: u32,
    highTime: String,
    low: String,
    lowTime: String,
}

#[derive(Serialize, Deserialize, Debug)]
struct Data {
    #[serde(with = "serde_with::json::nested")]
    data: Vec<Latest>,
}

#[derive(Serialize, Deserialize, Debug)]
struct Datav2 {
    #[serde(with = "serde_with::json::nested")]
    data: HashMap<u32, Vec<Latest>>,
}
#[cfg(not(target_arch = "wasm32"))]
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {

     let res = reqwest::get(url).await?;
    let response = &res.json::<Datav2>().await?;

}

我嘗試了兩個版本的數據結構。 數據使用最新的向量,但我注意到每個對象都有一個唯一的 ID,所以在 DataV2 中我嘗試使用哈希圖,但我得到了同樣的錯誤。 我也嘗試過不使用 Serde_with 的未嵌套版本。

我收到錯誤Error: reqwest::Error { kind: Decode, source: Error("invalid type: map, expected valid json object", line: 1, column: 8)

看來我的數據結構搞砸了,但已經嘗試了幾個小時來找出要使用的正確數據結構。

您當前的代碼存在多個問題。

  1. Datav2更接近,但仍然不正確。 它不是HashMap<u32, Vec<Latest>>而是HashMap<u32, Latest> 不需要有另一個Vec ,因為每個數字都在 JSON 中分配了一個值。
  2. highTimelowlowTime不是String類型(因為它們在 JSON 中沒有引號),而是無符號數字(為了安全起見,我只是假設它們是u64 )。
  3. 顯然Latest的字段可以是null ,所以它們需要是Option s。
  4. 我仍然會使用snake_case作為struct中的字段名稱,然后使用 serde 宏將它們重命名為camelCase

我修改了您的代碼,就像我會這樣做一樣,以便為您提供一個如何完成的示例:

use std::collections::HashMap;

use serde::{Serialize, Deserialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
struct Latest {
    high: Option<u64>,
    high_time: Option<u64>,
    low: Option<u64>,
    low_time: Option<u64>,
}

#[derive(Serialize, Deserialize, Debug)]
struct Data {
    data: HashMap<u64, Latest>,
}

#[cfg(not(target_arch = "wasm32"))]
#[tokio::main]
async fn main() -> Result<(), reqwest::Error> {
    let url = "https://prices.runescape.wiki/api/v1/osrs/latest";
    let res = reqwest::get(url).await?;
    let response = &res.json::<Data>().await?;

    println!("{:#?}", response);

    Ok(())
}

暫無
暫無

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

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