首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将serde_json::error::Error转换为reqwest::error::Error?

如何将serde_json::error::Error转换为reqwest::error::Error?
EN

Stack Overflow用户
提问于 2020-01-05 22:04:27
回答 1查看 1.8K关注 0票数 7

Reqwestv0.9将serdev1.0作为依赖项,因此实现了将json错误转化为reqwest错误

在我的代码中,我使用serde_json进行反序列化,而不是使用reqwest附带的.json()方法。

代码语言:javascript
复制
// reqwest = "0.9"
// serde = { version = "1.0", features = ["derive"] }
// serde_json = "1.0"

pub fn get_meta(client: &reqwest::Client) -> Result<Meta, reqwest::Error> {
    let mut resp = client
        .get("http://localhost:8080/requests/playlist.json")
        .send()?;

    let data: Value = serde_json::from_str(&resp.text()?).unwrap();
    let data = data["children"][0]["children"].clone();
    let metas: Vec<Meta> = serde_json::from_value(data).unwrap();
    let meta: Meta = metas.last().expect("nothing is playing").clone();
    Ok(meta)
}

目前,我正试图将serde_json错误作为reqwest错误返回。将let metas: Vec<Meta> = serde_json::from_value(data).unwrap();更改为let metas: Vec<Meta> = serde_json::from_value(data)?;失败,出现以下错误:

代码语言:javascript
复制
 the trait `std::convert::From<serde_json::error::Error>` is not implemented for `reqwest::error::Error`

是否可以通过将serde_json::error::Error包装在reqwest的Kind::Json错误枚举中,将其转换为reqwest::error::Error,还是必须进行自定义错误枚举,其中包含此文章中提到的两者

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-06 13:46:26

不,您不能自己构造reqwest::Error值,因为它:

  • 有非公共字段
  • 不公开公共构造函数。
  • 没有公共类型的From实现。

幸运的是,reqwest::Errorserde_json::error::Error都实现了std::error::Error特性。根据您链接的博客文章中的建议,anyhow机箱在这里非常有用:

代码语言:javascript
复制
// reqwest = "0.9"
// serde = { version = "1.0", features = ["derive"] }
// serde_json = "1.0"
// anyhow = "1.0"

pub fn get_meta(client: &reqwest::Client) -> Result<Meta, anyhow::Error> {
    let mut resp = client
        .get("http://localhost:8080/requests/playlist.json")
        .send()?;

    let data: Value = serde_json::from_str(&resp.text()?).unwrap();
    let data = data["children"][0]["children"].clone();
    let metas: Vec<Meta> = serde_json::from_value(data).unwrap();
    let meta: Meta = metas.last().expect("nothing is playing").clone();
    Ok(meta)
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59604604

复制
相关文章

相似问题

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