反序列化带有特殊字符的相邻标记数据

Deserializing adjacently tagged data with special characters

我有JSON个数据需要反序列化,格式为

[
  {
    "tag": "path\like\string",
    "data": [{"fieldA": 1}, {"fieldA": 2}]
  },
  {
    "tag": "another\path\like\string",
    "data": [{"fieldA": 3, "fieldB": "some string"}, {"fieldA": 4, "fieldB": "some string"}]
  },
  ...
]

一些搜索将我带到了这个关于 Adjacently tagged serde 文档页面上“枚举表示”下的数据的页面,它看起来非常适合我的用例。唯一的问题是,在构造我的枚举时,枚举变体名称必须与 tag 字段内的名称匹配,在这种情况下我不能这样做,因为 tag 字段包含特殊字符。

无论如何我可以使用 serde 做这样的事情

enum Data {
    VariantA(Vec<...>),
    VariantB(Vec<...>)
}

使用我的 JSON 数据?我目前无法更改 JSON 数据的格式。

我在将枚举配置为使用相邻标记进行序列化后添加了 variant renaming。感谢@Masklinn 向我指出这一点。

因此 JSON 数据

[
  {
    "tag": "path\like\string",
    "data": [{"fieldA": 1}, {"fieldA": 2}]
  },
  {
    "tag": "another\path\like\string",
    "data": [{"fieldA": 3, "fieldB": "some string"}, {"fieldA": 4, "fieldB": "some string"}]
  },
  ...
]

相应的枚举应该是这样的:

use serde::Deserialize;

#[derive(Debug, Deserialize)]
#[serde(tag = "tag", content = "data")]
enum Data {
    #[serde(rename = "path\like\string")]
    VariantA(Vec<...>),

    #[serde(rename = "another\path\like\string")]
    VariantB(Vec<...>),
}