rust - 如何为Serde编写自定义的named_all属性?

标签 rust serde

因此,对于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/

相关文章:

rust - 有没有办法让 serde_json 严格反序列化?

json - 如何在不丢失任何值的情况下反序列化具有重复键的JSON?

hashmap - 使用 Rust HashMap - .find() 没有返回匹配的预期值

generics - 一个函数如何要求一个类型实现一个特征而不删除现有的特征边界?

rust - Rocket 中基于 header 的全局认证/授权

networking - 创建PNET数据链接 channel 时出现Rust错误 “PermissionDenied: Operation Not Permitted”

rust - 使用 Serde 反序列化对象时,有没有办法省略包装器/根对象?

json - Serde反序列化为多个结构之一?

rust - 无法使 Serde Serialize 工作的基本示例

types - 为什么这个闭包参数需要显式类型?