反序列化带有特殊字符的相邻标记数据
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<...>),
}
我有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<...>),
}