我试图从这个端点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?;

}

我try 了两个版本的数据 struct .数据使用的是一个最新的向量,但我注意到每个对象都有一个唯一的ID,所以在DataV2中,我try 使用hashmap,但得到了相同的错误.我还try 了不使用Serde\u的不受欢迎的版本.

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

看起来我的数据 struct 一团糟,但我已经花了几个小时试图找出要使用的正确数据 struct .

推荐答案

当前代码存在多个问题.

  1. Datav2更接近,但仍然不正确.它不是HashMap<u32, Vec<Latest>>而是HashMap<u32, Latest>.由于每个数字在JSON中都分配了一个值,因此无需再设置Vec.
  2. highTimelowlowTime不是String类型(因为它们在JSON中没有引号),而是无符号数字(为了安全起见,我假设它们是u64).
  3. 显然,Latest的字段可以是null,所以它们必须是Option.
  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(())
}

Json相关问答推荐

Vega-Lite时钟(使用Vega-Lite中的计时器)

如何在PowerShell中扩展JSON中的嵌套数组

使用动态和可变JSON的图表多条

Terraform迭代JSON文件以获取键值对

集成wix.comstore API|变音符号问题

合并2个嵌套词典

Moshi:序列化 List 时出现问题

使用 jq 获取所有嵌套键和值

将boost::beast::multibuffer转换为std::istream

如何将复杂的 JSON 反序列化为 Rust 类型?

如何实现一个通用的 serde_json::from_str

为什么根据其他工具,来自 aws rds 的 JSON 在 Docker 中格式错误运行?

将文本转换为 python 列表

JSON 模式验证

哪个更好:Json 或 XML (PHP)

如何从Typescript 中的json响应中获取日期对象

如何使用 Serde 反序列化带有自定义函数的可选字段?

与classic 规范化表相比,postgres JSON 索引是否足够高效?

杰克逊在通用列表中读取 json

如何在本地存储中存储对象数组?