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

标签 rust

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

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

// 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)?;失败并出现以下错误:

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

是否可以转换serde_json::error::Errorreqwest::error::Error将其包裹在 Kind::Json 内reqwest 的错误枚举,或者我是否必须创建一个包含这两者的自定义错误枚举 article

最佳答案

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

  • 有非公开字段
  • 不公开公共(public)构造函数
  • 没有公共(public)类型的 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)
}

关于rust - 如何将 serde_json::error::Error 转换为 reqwest::error::Error?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59604604/

相关文章:

rust - 你如何访问 Rust 中的枚举值?

rust - 向量(或迭代器)的 bool 掩码

data-structures - 如何在不需要分配给新变量的情况下为链表实现前置?

string - 在 Rust 中查询结构向量

assembly - 使用参数时的内联汇编混淆

rust - 找不到tokio::main宏?

c - 为什么 C/RUST 中的一个加法运算在结果 ASM 中有 3 个 double 浮点加法工具?

memory-management - 为什么第二个变量的地址不在第一个变量之后?

json - 使用 serde_json 序列化带有非字符串键的映射

rust - 派生特征会导致意外的编译器错误,但手动实现有效