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

duc*_*ale 6 rust

reqwest v0.9 将 serde v1.0 作为依赖项,因此实现了将 serde_json 错误转换为 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)
}
Run Code Online (Sandbox Code Playgroud)

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

 the trait `std::convert::From<serde_json::error::Error>` is not implemented for `reqwest::error::Error`
Run Code Online (Sandbox Code Playgroud)

是否可以通过将serde_json::error::Errorreqwest::error::Error包装在Kind::Jsonreqwest 的错误枚举中来转换为,或者我是否必须创建一个包含本文中提到的两者的自定义错误枚举?

edw*_*rdw 6

不,你无法reqwest::Error自己构建价值,因为它:

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

幸运的是,两者reqwest::Errorserde_json::error::Error实现了std::error::Error特质。根据您链接的博客文章的推荐,该anyhow板条箱在这里非常有用:

// 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)
}
Run Code Online (Sandbox Code Playgroud)