#[serde(rename)] 似乎是正确的选择,但文档未说明是否可行或如何执行。
此JSON对象:
{
"name" : "myobject"
"info" :
{
"counter" : "3"
"foo" : "bar"
}
}
Run Code Online (Sandbox Code Playgroud)
相应的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,
}
Run Code Online (Sandbox Code Playgroud)
没有使用属性的内置方法,但是您可以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());
}
Run Code Online (Sandbox Code Playgroud)
输出为:
Object {
name: "myobject",
count: 3,
foo: "bar"
}
Run Code Online (Sandbox Code Playgroud)
在三个明显不同的地方会出现无关紧要的嵌套:
这三个都需要不同的方法。在此问题中观察到#1。
要解决#2或#3,请参见在使用Serde反序列化对象时,是否可以忽略包装器/根对象?
| 归档时间: |
|
| 查看次数: |
793 次 |
| 最近记录: |