首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复reqwest json解码错误?

如何修复reqwest json解码错误?
EN

Stack Overflow用户
提问于 2021-01-17 14:15:01
回答 1查看 723关注 0票数 2

当我运行以下代码时:

代码语言:javascript
复制
use exitfailure::ExitFailure;
use reqwest::Url;
use serde_derive::{Deserialize, Serialize};
use std::env;

#[derive(Serialize, Deserialize, Debug)]
struct CompanyInfo {
    country: String,
    currency: String,
    exchange: String,
    ipo: String,
    marketCapitalization: u128,
    name: String,
    phone: String,
    shareOutstanding: f64,
    ticker: String,
    weburl: String,
    logo: String,
    finnhubIndustry: String,
}

impl CompanyInfo {
    async fn get(symbol: &String, api_key: &String) -> Result<Self, ExitFailure> {
        let url = format!(
            "https://finnhub.io/api/v1/stock/profile2?symbol={}&token={}",
            symbol, api_key
        );

        let url = Url::parse(&*url)?;
        let res = reqwest::get(url).await?.json::<CompanyInfo>().await?;

        Ok(res)
    }
}

#[tokio::main]
async fn main() -> Result<(), ExitFailure> {
    let api_key = "MY API KEY".to_string();
    let args: Vec<String> = env::args().collect();
    let mut symbol: String = "AAPL".to_string();

    if args.len() < 2 {
        println!("Since you didn't specify a company symbol, it has defaulted to AAPL.");
    } else {
        symbol = args[1].clone();
    }

    let res = CompanyInfo::get(&symbol, &api_key).await;
    println!("{:?}", res);

    Ok(())
}

我得到一个错误:Err(错误解码响应体:预期的',‘或'}’在第1行235列)。对于另一个API,具有类似结构的代码可以工作。你怎么用reqwest解决这个问题呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-18 00:15:43

通常,error decoding response body意味着您试图反序列化给定格式的HTTP响应,但响应正文对于该格式无效。在本例中,您正在尝试反序列化JSON,因此该错误意味着您正在尝试反序列化的对象可能不是有效的JSON,或者它可能是有效的JSON,但您期望的JSON结构与从服务器返回的结构不匹配。服务器可能错误地创建了它的JSON,或者由于特定原因(例如,如果返回500响应,某些API不会返回JSON ),它返回的响应体实际上不是JSON。

为了调试和修复这个问题,您需要确切地知道您试图解析的响应体是什么样子的。要做到这一点,一种方法是将代码的解析分为两部分:一部分获取文本,另一部分尝试解析。例如,出于调试目的,您可以通过执行类似以下操作来打印收到的响应:

代码语言:javascript
复制
// Split up the JSON decoding into two steps.
// 1.) Get the text of the body.
let response_body = reqwest::get(url).await?.text().await?;
println!("Response Body: {}", response_body);

// 2.) Parse the results as JSON.
let res: CompanyInfo = serde_json::from_str(&response_body)?;

这段代码可能会像以前一样失败,但现在您将会打印出失败的响应体。在这一点上,您将不得不分析响应正文,在这一点上,希望它会变得显而易见,为什么它不工作。

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

https://stackoverflow.com/questions/65757876

复制
相关文章

相似问题

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