Mit JSON-Objekten arbeiten
JSON-Objekte und alle anderen Objekte verhalten sich wie die Infotable-Objekte. Es handelt sich um Klone.
Beispiel:
Der folgende Code führt zu unerwartetem Verhalten. Die Änderung scheint erfolgt zu sein, ist aber tatsächlich nicht persistent, wenn es sich um eine persistente Eigenschaft handelt. Dies ist das Verhalten, das Sie auch in ThingWorx 8.4 beobachten würden. Die im Arbeitsspeicher vorhandene Version des Werts wird geändert, aber nicht ordnungsgemäß persistent gemacht.
me.jsonProp['key'] = 'newValue';
Sie können dem Eigenschaftswert eine JSON-Zeichenfolge zuweisen, um richtig mit JSON-Objekten zu arbeiten:
me.jsonProp= {'key':'newValue'};
Sie können auch eine Kopie der Eigenschaft erstellen, Aktualisierungen vornehmen und sie dann wieder der ursprünglichen Eigenschaft zuweisen:
var json = me.jsonProp;
json['key'] = 'newValue';
me.jsonProp = json;
Alle Eigenschaftswerte werden in einer Zwischenspeicherschicht gespeichert. Das im JavaScript verwendete Objekt ist nur ein Wrapper für das Objekt, das einige Schreibvorgänge zurück in den Zwischenspeicher verarbeitet, um bei der Legacy-Unterstützung zu helfen. Für direkte Objektaktualisierungen wird nur eine Schicht oder nur ein Wrapper unterstützt. Es ist wichtig zu verstehen, dass jede Zuweisung das gesamte Objekt zurück in den Zwischenspeicher schreibt, sodass Sie immer eine Kopie erstellen sollten, wenn Sie mehrere Änderungen vornehmen müssen.
Das folgende Beispiel funktioniert nicht. Das json-Objekt ist ein Wrapper für das ursprüngliche Objekt, unit ist jedoch ein Unterobjekt und kein Wrapper. Durch Zuweisen von .unit wird der Wert also nicht zurück in das zwischengespeicherte Objekt geschrieben:
input.recurrent.unit = "MB"
Sie können einen der folgenden Workarounds verwenden:
Arbeiten Sie an einem Unterbereich des Dokuments, und weisen Sie diesen zurück an das Objekt:
json = input.recurrent
json.unit = "MB";
input.recurrent = json <--- this does a cache update
Wenn Sie mehrere Werte in der JSON-Datei aktualisieren müssen, sollten Sie immer eine Kopie des gesamten Objekts erstellen, an dem Objekt arbeiten und es anschließend and das Objekt zurückweisen, um die beste Leistung zu erhalten.
json = JSON.parse(input);
json.recurrent.unit ="MB";
input = json <--- this does a cache update
Zwischenspeicher-Schreibvorgänge sollten für eine optimale Leistung eingeschränkt werden. Im Einzelserver-Modus sind diese Schreibvorgänge recht schnell ausführbar, im Hochverfügbarkeits-Cluster-Modus ist der Zwischenspeicher jedoch verteilt, sodass jeder Schreibvorgang Auswirkungen auf die Leistung hat.
input.value = 5 <--- this does a cache update
input.text = "junk" <--- this does a cache update
War dies hilfreich?