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

在Rust中使用serde_json实现大JSON的部分反序列化可行吗?

Rust中使用serde_json仅反序列化JSON部分属性的实现方法

完全可以只反序列化JSON中的指定属性,忽略其余字段,serde_json默认支持该特性,具体实现步骤如下:

1. 配置依赖

在Cargo.toml中添加serde和serde_json依赖,确保启用derive特性:

[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"

2. 定义对应结构体

只需要在结构体中声明你需要的字段,嵌套结构(比如示例中的buy_links数组)也要定义对应的子结构体:

use serde::Deserialize;

// 对应buy_links中的单个链接对象
#[derive(Debug, Deserialize)]
struct BuyLink {
    name: String,
    url: String,
}

// 主结构体仅保留需要的两个字段
#[derive(Debug, Deserialize)]
struct BookResponse {
    amazon_product_url: String,
    buy_links: Vec<BuyLink>,
}

3. 执行反序列化操作

直接使用serde_json::from_str(或从字节流反序列化的from_slice)即可,未定义的字段会自动被忽略:

use serde_json::Result;

fn main() -> Result<()> {
    // 替换为实际接口返回的JSON字符串/字节流
    let json_content = r#"{
        "age_group": "",
        "amazon_product_url": "https://www.amazon.com/dp/0063221489?tag=NYTBSREV-20",
        "article_chapter_link": "",
        "asterisk": 0,
        "author": "Jared Kushner",
        "book_image": "https://storage.googleapis.com/du-prd/books/images/9780063221482.jpg",
        "book_image_height": 500,
        "book_image_width": 331,
        "book_review_link": "",
        "book_uri": "nyt://book/e5ec4777-5f2f-5622-9288-9b1d96e8fe1d",
        "buy_links": [
            {"name": "Amazon", "url": "https://www.amazon.com/dp/0063221489?tag=NYTBSREV-20"},
            {"name": "Apple Books", "url": "https://goto.applebooks.apple/9780063221482?at=10lIEQ"},
            {"name": "Barnes and Noble", "url": "https://www.anrdoezrs.net/click-7990613-11819508?url=https%3A%2F%2Fwww.barnesandnoble.com%2Fw%2F%3Fean%3D9780063221482"}
        ]
    }"#;

    let parsed_data: BookResponse = serde_json::from_str(json_content)?;
    
    // 打印获取到的目标字段
    println!("亚马逊商品链接: {}", parsed_data.amazon_product_url);
    println!("购买链接列表: {:?}", parsed_data.buy_links);

    Ok(())
}

额外说明

  • 如果JSON字段名与Rust结构体字段名不一致,可通过#[serde(rename = "json字段名")]注解映射,例如:
    #[derive(Debug, Deserialize)]
    struct BookResponse {
        #[serde(rename = "amazon_product_url")]
        amazon_url: String,
        buy_links: Vec<BuyLink>,
    }
    
  • 若需严格禁止未知字段(默认是允许并忽略),可添加#[serde(deny_unknown_fields)]注解到结构体上,此时若JSON存在未定义字段会直接返回反序列化错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:55:19