[英]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)
看來我的數據結構搞砸了,但已經嘗試了幾個小時來找出要使用的正確數據結構。
您當前的代碼存在多個問題。
Datav2
更接近,但仍然不正確。 它不是HashMap<u32, Vec<Latest>>
而是HashMap<u32, Latest>
。 不需要有另一個Vec
,因為每個數字都在 JSON 中分配了一個值。highTime
, low
, lowTime
不是String
類型(因為它們在 JSON 中沒有引號),而是無符號數字(為了安全起見,我只是假設它們是u64
)。Latest
的字段可以是null
,所以它們需要是Option
s。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.