gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:20:13 24 4
gpt4 key购买 nike

#[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,
}

最佳答案

没有内置方法可以使用属性执行此操作,但您可以为您的 Object 类型编写自己的 Deserialize 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 在这个问题中被观察到。

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

关于json - 在使用 serde_json 解析时是否可以展平子对象字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55866500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com