2015-03-17 2 views
12

Мне было интересно, можно ли декодировать объект JSON в Rust, который имеет имя атрибута, которое также является ключевым словом Rust. Я работаю с rustc-сериализация обрешеткой и мое определение структуры выглядит следующим образом:Как декодировать объект JSON с именем атрибута ключевого слова Rust?

#[derive(RustcDecodable)] 
struct MyObj { 
    type: String 
} 

Компилятор выдает ошибку, поскольку типа является ключевым словом. Точное сообщение об ошибке компилятора:

error: expected identifier, found keyword `type` 
src/mysrc.rs:23  type: String, 
          ^~~~ 

Извините за вопрос новобранец, я только что начал опробовать ржавчину.

+0

Безопасно предположить, что исходные данные не могут быть изменены, чтобы избежать конфликта? – Shepmaster

+0

Да, было бы лучше, если бы мне не пришлось менять исходные данные. Я думаю, возможно, создание нового поля структуры с другим именем и создание пользовательского 'impl Decodable' является единственным способом? – rking788

+0

Я могу увидеть, как это было реализовано вручную, или с помощью 'Json :: from_str', а затем высунуло его значение результата. – Shepmaster

ответ

15

Вы можете использовать ящик serde. Он поддерживает переименование полей since February 2015

Ваш пример может выглядеть следующим образом:

#[derive(Deserialize)] 
struct MyObj { 
    #[serde(rename = "type")] 
    type_name: String 
} 
+0

Кажется, именно то, что я искал. В нем говорится, что он делает некоторые взгляды, знаете ли вы, можно ли анализировать атрибут, который может быть одним из нескольких разных типов? поэтому поле с именем msg может быть либо строкой JSON, либо массивом. – rking788

+0

Это была одна из главных причин, по которой был изобретен серд, потому что старый десериализатор не мог прочитать перечисление, не предварительно прочитав тег. –

+0

Awesome. Спасибо за вашу помощь. – rking788

Смежные вопросы