2017-12-29 1 views
4

In JSON.mappingdocumentation explizit angegeben der Wert type Eigenschaft sollte einzigen Typ sein. Aber auch in der Praxis Union-Typ funktioniert:Wie funktioniert das JSON.mapping-Makro mit Verbindungstypen von Argumenten?

json1 = %q({"ok": true, "result": [{"type": "update", "id": 1}, {"type": "update", "id": 2}]}) 
json2 = %q({"ok": true, "result": {"type": "message"}}) 

class Response 
    JSON.mapping({ 
    ok: Bool, 
    result: Message | Array(Update) 
    }) 
end 

class Update 
    JSON.mapping({ 
    type: String, 
    id: Int32 
    }) 
end 

class Message 
    JSON.mapping({ 
    type: String 
    }) 
end 

Aufruf Response.from_json sowohl JSON-String ausgegeben erwartetes Ergebnis.

Response.from_json json1 

AUSGABE:

#<Response:0x10d20ce20 
    @ok=true, 
    @result= 
    [#<Update:0x10d20cc60 @id=1, @type="update">, 
    #<Update:0x10d20cbe0 @id=2, @type="update">]> 

Und

Response.from_json json2 

AUSGABE:

#<Response:0x10d20c180 
    @ok=true, 
    @result=#<Message:0x10e241f80 @type="message">> 

Meine Frage ist, wie funktioniert es? Ist es ein erwartetes Verhalten oder eine zufällige unzuverlässige Funktion?

Antwort

0

Dies wird erwartet, die Dokumentation ist falsch.

+0

In diesem Fall, wie wählt das Makro, welchen Typ auf die Weitergabe Json anzuwenden? Betrachten Sie das folgende Spiel - https://play.crystal-lang.org/#/r/3b84. "Message" und "Nessage" Typ sind gleich, aber egal in welcher Reihenfolge ich sie in der Klassendeklaration oder im Typ union angeben, der Mapper wählt immer die 'Message'. – vtambourine

+1

Es ist in alphabetischer Reihenfolge, so scheint es. – RX14

Verwandte Themen