Как написать собственное свойство rename_all для serde? - PullRequest
2 голосов
/ 09 мая 2020

Так что, будучи новичком в Rust, мне пришлось десериализовать json из формата "title case" в snake case (например, {"Car Prop": 1, "Door Prop": 2}). Библиотека serde в Rust, кажется, предоставляет все распространенные форматы, кроме этого - https://serde.rs/container-attrs.html.

1) Что это за фрагмент кода, называемый #[serde(rename_all = "...")]? Это ссылка на правило макроса? И если да, то где в коде serde я мог бы go его искать?

2) Как мне реализовать свой собственный «контейнерный атрибут», чтобы выполнить десериализацию из «заголовка» json в структура со свойствами в snake_case? Я понимаю, что это может быть довольно сложно, поэтому даже ответ на 1, который укажет мне правильное направление, будет большим подспорьем, спасибо.

1 Ответ

0 голосов
/ 15 мая 2020

Насколько мне известно, добавление дополнительных правил переименования в настоящее время невозможно. Что касается вашего первого вопроса, да, это макрос. Если вы посмотрите на код 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 приведен пример здесь: Реализация десериализации вручную для структуры .

Здесь я создал полный рабочий пример: ржавая площадка

...