【问题标题】:How to convert serde_json::error::Error to reqwest::error::Error?如何将 serde_json::error::Error 转换为 reqwest::error::Error?
【发布时间】:2020-04-23 13:18:08
【问题描述】:

reqwest v0.9 将 serde v1.0 作为依赖项,因此实现了converting serde_json errors into reqwest error

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

// 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&lt;Meta&gt; = serde_json::from_value(data).unwrap(); 更改为 let metas: Vec&lt;Meta&gt; = serde_json::from_value(data)?; 失败并出现以下错误:

 the trait `std::convert::From<serde_json::error::Error>` is not implemented for `reqwest::error::Error`

是否可以通过将 serde_json::error::Error 包装在 reqwest 的 Kind::Json 错误枚举中来将 serde_json::error::Error 转换为 reqwest::error::Error,或者我是否必须制作一个包含这两者的自定义错误枚举,如 article 中提到的那样?

【问题讨论】:

  • reqwest::Error 类型是reqwest crate 的内部错误类型。它不公开任何公共构造函数,或公共类型的From 实现;实例只能从reqwest crate 中构建。所以简短的回答是:不,您不能将任何其他类型转换为reqwest::Error,而需要使用其他错误类型。

标签: rust


【解决方案1】:

不,你不能构造reqwest::Error 重视自己,因为它:

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

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

// 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 2020-03-26
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2022-06-16
    相关资源
    最近更新 更多