SetSerializeMode(mode)
mode
angegebenen.
Derzeit sind die folgenden Serialisierungsmodi verfügbar: #SERIALIZEMODE_HOLLYWOOD
,
#SERIALIZEMODE_LIST
und #SERIALIZEMODE_NAMED
. Wie die einzelnen
Serialisierungsmodi interpretiert werden, hängt vom Serialisierer ab.
Der ältere Serialisierer von Hollywood, der in ein proprietäres Format
serialisiert, unterstützt nur #SERIALIZEMODE_HOLLYWOOD
. Der JSON-Serialisierer
von Hollywood unterstützt alle drei Serialisierungsmodi, die er
folgendermaßen interpretiert:
#SERIALIZEMODE_HOLLYWOOD:
t = {foo = "bar", seqarray = {1,2,3,4,5}, sparsearray = {1,[2]=2,[4]=3,[6]=4,[8]=5}} |
Wenn Sie dies mit dem Hollywood-Serialisierungsprogramm in JSON serialisieren, sieht das Ergebnis so aus:
{ "seqarray": [1,2,3,4,5], "sparsearray": {"0": 1, "2": 2, "4": 3, "6": 4, "8": 5}, "foo": "bar" } |
Sie können sehen, dass Sparse-Arrays mithilfe von benannten JSON-Indizes serialisiert werden. Das wiederum bedeutet, dass bei der Deserialisierung von JSON-Dateien mit dem Hollywood-Serialisierer benannte Elemente, die nur aus Zahlen bestehen, als Sparse-Array-Felder interpretiert werden, weshalb der Hollywood-Serialisierer nicht zur Deserialisierung beliebiger JSON-Dateien verwendet werden kann, sondern sollte nur mit JSONs verwendet werden, die vom Hollywood-Serialisierungsprogramm erstellt wurden.
Ein weiterer Nachteil des Hollywood-Serialisierers besteht darin, dass die
Position von Elementen in der JSON-Datei völlig zufällig sein kann, da sie
aus Hollywood-Tabellenfeldern serialisiert werden, die keine bestimmte
Reihenfolge haben. Wenn Sie möchten, dass die JSON-Elemente eine
feste Reihenfolge beibehalten, müssen Sie stattdessen #SERIALIZEMODE_LIST
verwenden.
Standardmäßig konvertiert #SERIALIZEMODE_HOLLYWOOD
alle JSON-Schlüsselnamen
in Kleinbuchstaben. Wenn Sie das nicht möchten, können Sie dies
ändern, indem Sie in SetSerializeOptions() den Tag NoLowerCase
auf
True
setzen. Siehe SetSerializeOptions für Details.
#SERIALIZEMODE_NAMED:
#SERIALIZEMODE_HOLLYWOOD
, außer dass er keine
Hollywood-Erweiterungen unterstützt. Das bedeutet, dass Sie nur Zahlen,
Zeichenketten und Tabellen serialisieren können, aber keine Binärdaten oder
Hollywood-Funktionen. Außerdem legt dieser Serialisierer Tabellen einige
Einschränkungen auf, nämlich dass sie entweder Zeichenkettenindizes oder
numerische Indizes verwenden müssen, aber nicht beides. Wenn numerische
Indizes verwendet werden, müssen diese Indizes auch strikt sequentiell sein,
d.h. Tabellenindizes müssen innerhalb eines bestimmten Bereichs [0..n]
sequentiell sein. Es dürfen keine Lücken wie im obigen Beispiel vorhanden
sein, daher ist es nicht möglich, Sparse-Arrays mit dem genannten Serialisierer
zu serialisieren. Der Vorteil von #SERIALIZEMODE_NAMED
gegenüber
#SERIALIZEMODE_HOLLYWOOD
besteht darin, dass Sie damit jede beliebige
JSON-Datei ohne Probleme deserialisieren können, da der benannte Serialisierer
keine Hollywood-Erweiterungen unterstützt. Dies liegt daran, dass die
benannten Serialisierer keine Markierungen verwenden, sodass keine Gefahr von
Konflikten zwischen JSON-Daten und Hollywood-Markierungen besteht.
Genau wie bei #SERIALIZEMODE_HOLLYWOOD
kann die Position von Elementen in
der JSON-Datei jedoch völlig zufällig sein, da sie aus Hollywood-Tabellenfeldern
serialisiert werden, die keine bestimmte Reihenfolge haben. Wenn Sie
möchten, dass die JSON-Elemente eine feste Reihenfolge beibehalten,
müssen Sie stattdessen #SERIALIZEMODE_LIST
verwenden.
Standardmäßig konvertiert #SERIALIZEMODE_NAMED
alle JSON-Schlüsselnamen in
Kleinbuchstaben. Wenn Sie das nicht möchten, können Sie dies ändern,
indem Sie in SetSerializeOptions() den Tag NoLowerCase
auf True
setzen.
Siehe SetSerializeOptions für Details.
#SERIALIZEMODE_LIST:
{ "firstName": "John", "lastName": "Smith", "isAlive": true, "age": 27, "address": { "streetAddress": "21 2nd Street", "city": "New York", "state": "NY", "postalCode": "10021-3100" } } |
Der Listenserialisierer speichert jeden Schlüsselwert in seiner eigenen
Tabelle unter Verwendung von key
und value
als benannte Tabellenindizes.
Um also auf Daten aus dem obigen JSON zuzugreifen, müssten Sie diesen
Code verwenden:
Print(t[3].key, t[3].value) ; "age 27" Print(t[4].value[2].key, t[4].value[2].value) ; "state NY" |
Mit dem Namen- oder Hollywood-Serialisierer können Sie auf die JSON-Daten zugreifen, indem Sie einfach den Schlüsselnamen verwenden:
Print(t.age) ; prints "27" Print(t.address.state) ; prints "NY" |
Wie Sie sehen können, führt die Verwendung des Namen- oder Hollywood-Serialisierers zu besser lesbarem Code, aber der Nachteil ist, dass die Elementreihenfolge im JSON nicht beibehalten wird, sodass das JSON möglicherweise schwieriger zu lesen ist.
Beachten Sie, dass bei Verwendung eines externen Serialisierers (z.B. eines Plugins) die Interpretation der verschiedenen Serialisierungsmodi völlig unterschiedlich sein kann. Die obige Dokumentation gilt nur für den integrierten JSON-Serialisierer von Hollywood.
Beachten Sie auch, dass dieser Befehl den Serialisierungsmodus global
ändert. Sie können den Serialisierungsmodus auch lokal ändern, indem Sie
den Tag Mode
in den optionalen Tabellenargumenten von Befehlen wie
SerializeTable() setzen. Siehe SerializeTable für Details.