首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理reqwest中嵌套的JSON对象?

如何处理reqwest中嵌套的JSON对象?
EN

Stack Overflow用户
提问于 2022-02-04 02:37:01
回答 1查看 500关注 0票数 2

我正在使用reqwest执行来自https://httpbin.orgGET请求。对像https://httpbin.org/ip这样的一级json端点执行请求很容易。

代码语言:javascript
复制
use std::collections::HashMap;

fn main() {
    let body = reqwest::blocking::get("https://httpbin.org/ip")
        .unwrap()
        .json::<HashMap<String, String>>()
        .unwrap();
    dbg!(body);
}

然而,我不知道如何使用多级别的JSON响应来处理其他端点。如何向reqwest中的多级JSON端点发出请求

代码语言:javascript
复制
use std::collections::HashMap;

fn main() {
    let body = reqwest::blocking::get("https://httpbin.org/get")
        .unwrap()
        .json::<HashMap<K, V>>()
        .unwrap();
    dbg!(body);
}
EN

回答 1

Stack Overflow用户

发布于 2022-02-04 04:06:05

正如@BallpointBen建议的那样,反序列化到serde_json::Value中肯定有效。但是在许多情况下,您将需要手动从任意json值中提取数据,这很繁琐。有一种更好的方法:反序列化为锈菌结构:

代码语言:javascript
复制
struct Response { /* … */ }

let body = reqwest::blocking::get("https://httpbin.org/get?arg=blargh")
    .unwrap()
    .json::<Response>()
    .unwrap();

要做到这一点,您需要向serde解释如何使用您的结构,例如:

代码语言:javascript
复制
use std::{collections::HashMap, net::IpAddr};
use serde::Deserialize;

#[derive(Deserialize)]
struct Response {
    args: HashMap<String, String>,
    // I'm making headers into another struct here to show some possibilities. You can of course make it a HashMap like args
    headers: ResponseHeaders,
    origin: IpAddr,
    url: url::Url,
}

#[derive(Deserialize)]
#[serde(rename_all = "PascalCase")]
struct ResponseHeaders {
    accept: String,
    host: String,
    #[serde(flatten)]
    dynamic: HashMap<String, String>,
}

反序列化为原生锈菌结构有点像兔子洞,上面有一个小

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70980804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档