#[serde(rename)]似乎是正确的 Select ,但文档中没有说明是否可能或如何做到这一点.

这个JSON对象:

{
   "name" : "myobject"
   "info" : 
   {
      "counter" : "3"
      "foo" : "bar"
   }
}

对应的flat rust struct 应为:

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

推荐答案

对于属性,没有内置的方法可以做到这一点,但是您可以为Object类型编写自己的Deserialize impl,它首先反序列化到某个中间助手表示,然后将数据重新排列到所需的 struct 中.

#[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());
}

输出为:

Object {
    name: "myobject",
    count: 3,
    foo: "bar"
}

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

  1. 毗邻其他领域
  2. 在最高层
  3. 在顶层之下

这三种方法都需要不同的方法#1在这个问题上被观察到.

要解决#2或#3,请参见Is there a way to omit wrapper/root objects when deserializing objects with Serde?

Rust相关问答推荐

使用元组执行条件分支的正确方法

如何从接收&;self的方法克隆RC

当Option为None时,Option数组是否占用Rust中的内存?

我怎样才能从一个Rust 的日期中go 掉3年?

何时可以在Rust中退出异步操作?

如何导入crate-type=[";cdylib;]库?

取得本地对象字段的所有权

是否可以使用Rust宏来构建元组的项?

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

当发送方分配给静态时,Tokio MPSC关闭通道

为什么Rust不支持带关联常量的特征对象?

Rust函数的返回值不能引用局部变量或临时变量

rust中的库插件管理器,现在是否可行?

Rust中的位移操作对范围有什么影响?

在 Rust 中,Weak 如何知道内部值何时被删除?

特征中定义的类型与一般定义的类型之间的区别

如何获得对数组子集的工作可变引用?

在 FFI 的上下文中,未初始化是什么意思?

为实现特征的所有类型实现显示

如何在 Rust 的内置函数上实现特征?