4
In JSON.mapping
documentation 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?
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
Es ist in alphabetischer Reihenfolge, so scheint es. – RX14