首页 > 解决方案 > 异步解析来自请求 GET 调用的 JSON 响应

问题描述

我正在对一些 API 进行 GET 调用,这反过来会返回listJSON 对象。但是,我无法将其解析为自定义数据结构列表。

我能到的最近的地方

struct Pokemon {
    id: i32,
    name: String,
    height: i32,
    weight: i32,
}

let mut response = client.get("http://pokeapi.co/api/v2/pokemon/111")
    .send()
    .expect("Failed to send request");
if let Ok(pokemon) = response.json::<Pokemon>() {
    println!("{:#?}", pokemon);
}

谁能为我提供合适的例子。另外,这是标准的做法吗?我的意思是使用类似的东西会有什么不同

let url = url.parse().expect("API URL parsing bug");
let request = Request::new(reqwest::Method::GET, url);

self.inner
    .execute(request)
    .map_err(Error::Request)
    .and_then(move |response: Response| {
        ...
    })

标签: jsonhttprust

解决方案


为了使用Response::json,你必须实现serde::Deserializefor Pokemon。您可以通过将以下内容添加到 Cargo.toml 中的[dependencies].

serde = { version = "1.0", features = ["derive"] }

然后,use serde::Deserialize;在文件顶部添加,并将声明更改Pokemon为:

#[derive(Deserialize)]
struct Pokemon {
    id: i32,
    name: String,
    height: i32,
    weight: i32,
}

推荐阅读