当前位置: 首页 > 面试题库 >

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

霍伟彦
2023-03-14
问题内容

#[serde(rename)] 似乎是正确的选择,但文档未说明是否可行或如何执行。

此JSON对象:

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

相应的 Flat Rust结构应为:

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

问题答案:

没有使用属性的内置方法,但是您可以Deserialize为自己的Object类型编写自己的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());
}

输出为:

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

在三个明显不同的地方出现了很少的嵌套:

  1. 邻近其他领域
  2. 本身在最高层
  3. 本身低于顶层

这三个要求不同的方法。在此问题中观察到#1。



 类似资料:
  • 我制作了一个类 在另一个类中 正如您所看到的,我创建了这个数组,并将UImages与txt和txt2一起放置在其中。简单地说,我要向用户显示一个图像,然后输入一个描述图像的输入,然后检查它是否匹配txt和txt2。在运行模拟器时,我得到以下错误: ***由于未捕获异常“nSunKnownKeyException”而终止应用程序,原因:“[ SetValue:ForUndefinedKey:]:对于

  • 问题内容: 动物是狗的超类,狗有一种叫bark的方法 考虑以下: 会发生什么? the assignment isn’t allowed the call to bark is allowed and “woof” is printed at run time the call to bark is allowed but nothing is printed the call to bark c

  • 我也需要扩展WebMvcConfigurationSupport类,修改两个内容: 我喜欢从WebMvcAutoConfiguration类注册的默认值,但是由于类上的条件注释,当我扩展WebMvcConfigurationSupport类时,它会防止自动配置的发生。 提前道谢!

  • 这个问题现有两种变体: 仅当字段不为空时验证:有条件地处理字符串的解决方案 Hibernate验证-仅在对象不为null时进行验证:唯一的答案演示了该行为,并提示您在手动触发验证时如何处理该行为 我的问题添加了限定符,即在可能为空的对象上使用@Valid时如何执行此操作。 这里的用例是,我们有两个字段,其中一个或另一个需要不为null(包含字段的类上的自定义验证器)。当一个不为null时,我需要它

  • 问题内容: 我正在寻找一个内置Java函数,例如可以将其转换为。 像这样: 还是我必须手动搜索并替换所有转义字符? 问题答案: 您可以从Apache Commons Lang使用 。它适用于所有转义序列,包括Unicode字符(即)。 https://commons.apache.org/lang/apidocs/org/apache/commons/lang3/StringEscapeUtils

  • 我通过将字符串转换为BSON来进行MongoDB查找。在进行转换之前,是否有办法确定我拥有的字符串是否是Mongo的有效ObjectID? 下面是我当前findByID函数的coffeescript。它工作得很好,但是如果我确定字符串不是ID,我希望通过不同的属性进行查找。