在使用serde_json解析时,是否可以展平子对象字段?

在使用serde_json解析时,是否可以展平子对象字段?,json,rust,serde,Json,Rust,Serde,#[serde(rename)]似乎是正确的选择,但文档没有说明是否可行或如何实现 此JSON对象: { “名称”:“myobject” “信息”: { “计数器”:“3” “foo”:“bar” } } 相应的平锈结构应为: #[derive(Deserialize)] struct Object { name: String, #[serde(rename="info.counter")] // wrong syntax here !! count: i32,

#[serde(rename)]
似乎是正确的选择,但文档没有说明是否可行或如何实现

此JSON对象:

{
“名称”:“myobject”
“信息”:
{
“计数器”:“3”
“foo”:“bar”
}
}
相应的平锈结构应为:

#[derive(Deserialize)]
struct Object {
    name: String,
    #[serde(rename="info.counter")] // wrong syntax here !!
    count: i32,
    #[serde(rename="info::foo")] // neither this works
    foo: String,
}

没有内置的方法来处理属性,但是您可以为您的
对象
类型编写自己的
反序列化
impl,该类型首先反序列化到某个中间帮助器表示,然后将数据重新排列到所需的结构中

#[macro_use]
extern crate serde_derive;

extern crate serde;
extern crate serde_json;

use serde::{Deserialize, Deserializer};

#[derive(Debug)]
struct Object {
    name: String,
    count: i32,
    foo: String,
}

impl<'de> Deserialize<'de> for Object {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
        where D: Deserializer<'de>
    {
        #[derive(Deserialize)]
        struct Outer {
            name: String,
            info: Inner,
        }

        #[derive(Deserialize)]
        struct Inner {
            count: i32,
            foo: String,
        }

        let helper = Outer::deserialize(deserializer)?;
        Ok(Object {
            name: helper.name,
            count: helper.info.count,
            foo: helper.info.foo,
        })
    }
}

fn main() {
    let j = r#"{
                 "name": "myobject",
                 "info": {
                   "count": 3,
                   "foo": "bar"
                 }
               }"#;

    println!("{:#?}", serde_json::from_str::<Object>(j).unwrap());
}

有三个实质上不同的地方出现了不重要的嵌套:

  • 毗邻其他领域
  • 在最高层次上独立存在
  • 在顶层之下
  • 这三种方法都需要不同的方法#1在这一问题中得到了遵守

    要解决#2或#3,请参见

    ,注意,使用嵌套结构不会降低性能;只有代码组织需要担心。这还不可能:
    Object {
        name: "myobject",
        count: 3,
        foo: "bar"
    }