Rust 在使用Serde反序列化对象时,有没有办法省略包装器/根对象?
我的目标如下:Rust 在使用Serde反序列化对象时,有没有办法省略包装器/根对象?,rust,serde,Rust,Serde,我的目标如下: { "data": { "id": 1, "name": "South America", "countries": { "data": [ { "id": 122, "name": "Brazil", "capital": "Brasilia" } ] } } } 我想定义两个结构,大陆和国家,省略不增加价值的数据包装。我
{
"data": {
"id": 1,
"name": "South America",
"countries": {
"data": [
{
"id": 122,
"name": "Brazil",
"capital": "Brasilia"
}
]
}
}
}
我想定义两个结构,
大陆
和国家
,省略不增加价值的数据
包装。我将使用包装结构来实现这一点,该结构可以直接用于删除嵌套的顶层,也可以通过#[serde(with=“…”)]
属性,用于消除反序列化数据结构中的嵌套级别
使用serde::{反序列化,反序列化程序};
#[派生(反序列化、调试)]
构造大陆{
id:u64,
名称:String,
#[serde(with=“Wrapper”)]
国家:Vec,
}
#[派生(反序列化、调试)]
结构国家{
id:u64,
名称:String,
大写:String,
}
#[导出(反序列化)]
结构包装器{
数据:T,
}
impl包装器{
fn反序列化,
D:反序列化你有-为什么你认为这些问题不是重复的?解决链接中的用例的最好方法(反序列化impl)不是解决这个用例的最好方法(不是反序列化impl)。请注意,有三个不同的地方出现了不重要的嵌套——与其他字段相邻(在你的链接中观察到),在最高级别上观察到,在最高级别下观察到(在这个问题中观察到)它们需要三种不同的方法。您对如何改进问题以更好地突出这些差异以提高搜索能力有何建议?我已将您的评论编辑到您的帖子中;是否可以说#3通过serde(with)
解决,而#2通过直接使用包装器解决?
use serde::{Deserialize, Deserializer};
#[derive(Deserialize, Debug)]
struct Continent {
id: u64,
name: String,
#[serde(with = "Wrapper")]
countries: Vec<Country>,
}
#[derive(Deserialize, Debug)]
struct Country {
id: u64,
name: String,
capital: String,
}
#[derive(Deserialize)]
struct Wrapper<T> {
data: T,
}
impl<T> Wrapper<T> {
fn deserialize<'de, D>(deserializer: D) -> Result<T, D::Error>
where
T: Deserialize<'de>,
D: Deserializer<'de>,
{
let wrapper = <Self as Deserialize>::deserialize(deserializer)?;
Ok(wrapper.data)
}
}
fn main() -> serde_json::Result<()> {
let j = r#"
{
"data": {
"id": 1,
"name": "South America",
"countries": {
"data": [
{
"id": 122,
"name": "Brazil",
"capital": "Brasilia"
}
]
}
}
}"#;
let wrapper: Wrapper<Continent> = serde_json::from_str(j)?;
println!("{:#?}", wrapper.data);
Ok(())
}