【问题标题】:How do I deserialize the byte stream from a reqwest response into JSON?如何将 reqwest 响应中的字节流反序列化为 JSON?
【发布时间】:2020-02-12 22:24:01
【问题描述】:

通过 reqwest 的请求需要一个长轮询响应,因此我创建了一个字节流并尝试将每个块反序列化为 JSON。我立即意识到这是错误的,因为每个块都可能不完整,因此反序列化可能会失败;即使一些块被反序列化为 JSON,它们中的大多数都失败了。我该怎么做?

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = reqwest::Client::new();
    let mut stream = client
        .get("https://...")
        .send()
        .await?
        .bytes_stream();

    while let Some(chunk) = stream.next().await {
        match serde_json::from_slice::<Value>(&chunk?){
            Ok(value) => println!("OK: {:?}", value),
            Err(e) => println!("ERROR: {:?}", e),
        }
    };

    Ok(())
}

【问题讨论】:

    标签: json rust deserialization serde reqwest


    【解决方案1】:

    如果您从Cargo.toml 中的reqwest 库启用功能@​​987654323@。然后您可以将代码简化为:

    let json = client
        .get("https://...")
        .send()
        .await?
        .json::<T>() //T needs to implement serde::de::DeserializeOwned
        .await?;
    

    这将发送请求并自动将其转换为 JSON。由于json 方法内部使用serde_json::from_reader,因此它还将字节流反序列化为结构体。

    如果响应正文不是 JSON 格式或无法正确反序列化为 T,这将失败。

    【讨论】:

      最近更新 更多