serde收集未知字段
2022-02-09

serde 收集未知字段


假设数据中的 json 只有一些固定字段, 其他字段未知, 你希望在 rust 中定义一个结构体, 将其他未知字段统一收集起来, 以便后面使用.

数据

{ "field_1": "111", "field_2": true, "unknown_1": "xx", ...more unkdown fields }

rust 结构体

use serde::{Serialize, Deserialize}

use serde_json::Value;


pub struct MyType {

    pub field_1: String,

    pub field_2: bool,

    #[serde(flatten)]

    pub unkowns: Value

}

此时所有未知字段将会被收集 unknowns 字段(此时字段类型为 Value::Obj). 当然你也可以将 unkowns 类型设为 Map<String, Value>, 避免后续使用不必要的 match.

此处的原理在于 使用 serde(flatten) 可以将字段数据展开到父级容器上. 详细说明请参考 flatten