You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust reqwest库中使用simd-json解析JSON响应

实现方案

reqwest 没有开放替换内置 JSON 解析器的扩展接口,其.json()方法硬编码依赖serde_json,无法直接替换默认实现,但可以通过直接读取响应原始字节的方式接入simd-json,完全规避.text()带来的额外转码、拷贝开销。

核心原理

不要调用响应的.text()方法:该方法会对原始响应字节做逐字节UTF-8校验、拷贝堆内存生成String,产生不必要的性能损耗。simd-json本身支持直接基于字节切片解析,还自带SIMD加速的UTF-8校验逻辑,只要拿到响应的原始字节即可完成解析,比.text()+serde_json的流程少一次全量字节遍历和编码转换开销。

具体实现

1. 添加依赖

先在Cargo.toml中引入所需依赖:

[dependencies]
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls"] }
simd-json = "0.14"
serde = { version = "1.0", features = ["derive"] }
tokio = { version = "1.0", features = ["rt-multi-thread", "macros", "net"] }

2. 基础解析代码

直接拿响应的原始字节做解析,无额外转码开销:

use simd_json::serde::from_slice;

// 自定义返回结构,和serde_json的用法完全兼容
#[derive(serde::Deserialize, Debug)]
struct ExampleResp {
    // 按接口实际字段定义即可
    status: String,
    code: u32,
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let resp = reqwest::get("https://www.example.com/api").await?;
    // 直接聚合响应原始字节,不做字符串转换
    let mut body_buf = resp.bytes().await?.to_vec();
    // simd-json 单遍完成SIMD加速的UTF-8校验、JSON解析
    let data: ExampleResp = from_slice(&mut body_buf)?;
    
    println!("{:?}", data);
    Ok(())
}

3. 封装和内置.json()一致的调用方法

可以给reqwest::Response加扩展trait,实现和原生API一致的调用体验:

trait ResponseSimdJsonExt {
    async fn json_simd<T: serde::de::DeserializeOwned>(self) -> Result<T, reqwest::Error>;
}

impl ResponseSimdJsonExt for reqwest::Response {
    async fn json_simd<T: serde::de::DeserializeOwned>(self) -> Result<T, reqwest::Error> {
        let mut body_buf = self.bytes().await?.to_vec();
        from_slice(&mut body_buf).map_err(|e| reqwest::Error::Decode(e.into()))
    }
}

// 调用示例
// let data = reqwest::get("xxx").await?.json_simd::<ExampleResp>().await?;

注意事项

  • simd-json需要CPU支持对应SIMD指令集:x86_64平台需支持AVX2(2013年后发售的消费级CPU基本均支持),ARM平台需支持NEON,不满足条件时会自动降级为标量解析,性能和serde_json基本持平
  • simd-json要求传入可变字节切片:解析过程中会临时修改缓冲区内容处理转义字符,解析完成后会自动还原,不会破坏原始数据
  • 不要为了省一次Vec拷贝直接操作Bytes的内部指针做对齐解析,该方案需要依赖unsafe逻辑判断引用计数和内存对齐,普通业务场景下Vec拷贝的开销远低于JSON解析本身的开销,性价比极低
  • 绝对不要先调用.text()再把String传给simd-json,相当于提前做了一次全量UTF-8校验和内存拷贝,完全抵消simd-json的性能优势

内容的提问来源于stack exchange,提问作者Test

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:45:33