![]() |
Delphi-Version: 10.2 Tokyo
JSONValue ändern
Moin!
Montag früh und massiver Weekend-Lag :-( Ich habe ein geparstes JSON-Object, zum Beispiel so:
Code:
und möchte darin den Wert von "value" auf "bar" ändern. Das Ganze habe ich als TJSONObject vorliegen. Das Ding kann ich via Typecast zu TJSONString wunderbar auslesen, aber schreiben find ich spontan keine Lösung (TJSONString.Value ist readonly)
{
"value":"foo" } Grüße Cody |
AW: JSONValue ändern
Das value/foo-Paar entfernen und ein neues hinzufügen? :stupid:
Delphi-Quellcode:
procedure p();
const input = '{"value":"foo"}'; var jsonObject: TJSONObject; begin jsonObject := TJSONObject.ParseJSONValue(input) as TJSONObject; try jsonObject.RemovePair('value').Free(); jsonObject.AddPair('value', 'bar'); // WriteLn( jsonObject.ToJSON() ); finally jsonObject.Destroy(); end; end; |
AW: JSONValue ändern
Man kann den Value eines TJSONString nicht ändern, nur ergänzen mit AddValue oder neu erzeugen und den Wert bei Create mitgeben. Wenn der JSONString ein Teil eines JSONObjects ist, kannst du das gesamte Pair mit RemovePair/AddPair austauschen.
Es sieht irgendwie so aus, als wolltest du JSON anders verwenden als vorgesehen. |
AW: JSONValue ändern
Ist ja nichts unanständiges dabei an diesem "Dokument" sich etwas herauszusuchen, dann ändern zu wollen und dann zurückzuspeichern. Hat man sich wahrscheinlich mit der Standard XML-Bibliothek so angewöhnt.
Ich lese immer komplett ein und schreibe später von neu auf zurück. Das ist immer am einfachsten 8-) |
AW: JSONValue ändern
Zitat:
Die offizielle Lösung: * bau dir ein entssprechendes Datenobjekt * und dann deseriallisieren, ändern und wieder serialisieren |
AW: JSONValue ändern
Um den tieferen Sinn kurz zu erklären: Ich habe mir eine Art Universalklasse gebaut, die strukturierte Daten aus allen möglichen Quellen entgegen nehmen kann (z.B. XML oder eben JSON).
Die einzelnen Knoten innerhalb der Datenquelle spreche ich per XPath an. Für XML gibts da ja IDOMNodeSelect.SelectNode(XPath) und für JSON habe ich mir eine kleine Konvertierungsroutine geschrieben, die einen XML-XPath in einen JSON-XPath umwandelt, der von TJSONValue.TryGetValue(XPath) verstanden wird. Von der Universalklasse leite ich dann spezialisierte Nachfahren ab, die das Parsen übernehmen. Innerhalb der Nachfahren behalte ich das eigentliche Datenobjekt im Speicher. Ich lese und schreibe die einzelnen Werte über Getter und Setter in der von TField bekannten Form .AsString, .AsInteger usw. Ganz am Ende gebe ich die manipulierten Daten dann wieder als strukturierte Texte aus. Das funktioniert bei XML auch alles soweit wie geplant und einigermaßen performant (wenngleich keine gigantischen Datenmengen anfallen). Bei JSON dagegen scheint die Implementierung im Delphi tatsächlich etwas bescheiden für solche Zwecke. Denn mit Remove/Add würde das zwar gehen, ändert dann aber auch die ursprünglich vorhandene Reihenfolge. Das mag aber nur ein Problem für Ästheten sein ;-) |
AW: JSONValue ändern
Zitat:
|
AW: JSONValue ändern
Zitat:
Meinste in deinem Produktiv-Quelltext?
Delphi-Quellcode:
program Project5;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils, System.Json; procedure p; const input = '{"value":"foo"}'; var jsonObject: TJSONObject; begin jsonObject := TJSONObject.ParseJSONValue(input) as TJSONObject; try WriteLn('Vorher: ', jsonObject.ToJSON); jsonObject.RemovePair('value').Free; jsonObject.AddPair('value', 'bar'); WriteLn('Nachher: ', jsonObject.ToJSON); finally jsonObject.Free; end; end; begin try p; except on E: Exception do WriteLn(E.ClassName, ': ', E.Message); end; Readln; end. |
AW: JSONValue ändern
Zitat:
|
AW: JSONValue ändern
Langsam bekomme ich das Gefühl dass in "Tokyo" wieder ordentlich gedreht wurde damit einem nicht langweilig wird.
|
AW: JSONValue ändern
Kommando zurück! Es geht doch. Nur weil wie ich schon vermutete durch Add/Remove die Reihenfolge geändert wird, steht der geänderte Wert nun ganz am Ende und nicht da wo er ursprünglich war. Mein Fehler also!
|
AW: JSONValue ändern
Hör auf dir abzugewöhnen darauf zu achten wie es aussieht, das sind doch nur Daten 8-)
|
AW: JSONValue ändern
Haste ja recht :-) In meinem Testprojekt waren die Testdaten etwas umfangreicher. Hab ich den Überblick verloren. Ich hätts gleich mit einfachen Daten füttern sollen. Aber warum einfach wenns auch kompliziert geht :-)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz