因此,对于Rust来说,我还需要将json从“标题大小写”格式反序列化为蛇形大小写(例如{“Car Prop”:1,1,“Door Prop”:2})。除this-https://serde.rs/container-attrs.html之外,Rust中的serde库似乎提供了每种常用格式。
1)这段称为#[serde(rename_all = "...")]
的代码是什么?这是对宏规则的引用吗?如果是这样,我可以在Serde代码中的何处寻找它?
2)我将如何实现自己的自定义“容器属性”以将“标题大小写” json反序列化为具有snake_case属性的结构?我意识到这可能会涉及很多,因此即使是对我的正确答案为1的答案也将是一个很大的帮助,谢谢。
最佳答案
据我所知,目前尚无法添加其他重命名规则。关于第一个问题,是的,它是一个宏。如果查看serde_derive
代码,您将看到宏使用RenameRule,它是具有所有可用重命名规则的枚举。
因此,您可能无法使用serde宏来实现所需的功能,但是可以编写自己的序列化和反序列化代码。因此,您无需自己编写宏,而是自己编写。
自定义序列化器如下所示:
#[derive(Debug)]
struct Message {
foo_bar: String,
bar_foo: String
}
impl Serialize for Message {
fn serialize<S>(&self, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
S: Serializer {
let mut state = serializer.serialize_struct("Message", 1)?;
state.serialize_field("Foo Bar", &self.foo_bar)?;
state.serialize_field("Bar Foo", &self.bar_foo)?;
state.end()
}
}
创建反序列化器会涉及更多的工作,但是
serde
文档在此处提供了一个示例:Manually implementing Deserialize for a struct。我在这里创建了一个完整的工作示例:rust playground
关于rust - 如何为Serde编写自定义的named_all属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61692015/