2015-03-17 7 views
12

Ich frage mich, ob es möglich ist, ein JSON-Objekt in Rust zu dekodieren, das einen Attributnamen hat, der auch ein Rust-Schlüsselwort ist. Ich arbeite mit dem rustc-serialize Kiste und meine struct Definition sieht wie folgt aus:Wie dekodiert man ein JSON-Objekt mit dem Rust-Attributnamen?

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

Der Compiler wirft einen Fehler, da Typ ein Schlüsselwort ist. Die genaue Compiler-Fehlermeldung lautet:

Sorry für die Anfängerfrage, ich habe gerade angefangen, Rust auszuprobieren.

+0

Ist es sicher davon ausgehen, dass die ursprünglichen Daten nicht um den Konflikt zu vermeiden geändert werden? – Shepmaster

+0

Ja, es wäre am besten, wenn ich die Quelldaten nicht ändern müsste. Ich denke, vielleicht ein neues struct-Feld mit einem anderen Namen zu erstellen und eine benutzerdefinierte 'impl Decodable' zu ​​schreiben ist der einzige Weg? – rking788

+0

Ich kann sehen, entweder manuell zu implementieren oder mit 'Json :: from_str' und dann stochern in seinen Ergebniswert. – Shepmaster

Antwort

15

Sie können die serde Kiste verwenden. Es unterstützt die Umbenennung von Feldern since February 2015

Ihr Beispiel dann wie folgt aussehen könnte:

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

Scheint genau, wonach ich gesucht habe. Es sagt, dass es einige Lookahead, weißt du, ob es möglich ist, ein Attribut zu analysieren, das einer von ein paar verschiedenen Typen sein könnte? Ein Feld namens msg könnte also entweder eine JSON-Zeichenfolge oder ein Array sein. – rking788

+0

Das ist einer der Hauptgründe, warum serde erfunden wurde, weil der alte Deserializer eine Enum nicht lesen konnte, ohne zuvor ein Tag gelesen zu haben. –

+0

Ehrfürchtig. Danke für Ihre Hilfe. – rking788

Verwandte Themen