Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 在使用Serde反序列化对象时,有没有办法省略包装器/根对象?_Rust_Serde - Fatal编程技术网

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(())
}