Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   JSONValue ändern (https://www.delphipraxis.net/197069-jsonvalue-aendern.html)

Codehunter 16. Jul 2018 09:05

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:
{
  "value":"foo"
}
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)

Grüße
Cody

Der schöne Günther 16. Jul 2018 09:17

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;

Uwe Raabe 16. Jul 2018 09:18

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.

Der schöne Günther 16. Jul 2018 09:29

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-)

himitsu 16. Jul 2018 09:33

AW: JSONValue ändern
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1407373)
Man kann den Value eines TJSONString nicht ändern, nur ergänzen mit AddValue oder neu erzeugen und den Wert bei Create mitgeben.

Jupp, die Implementation lässt an einigen Stellen zu wünschen übrig.

Die offizielle Lösung:
* bau dir ein entssprechendes Datenobjekt
* und dann deseriallisieren, ändern und wieder serialisieren

Codehunter 16. Jul 2018 10:22

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 ;-)

Codehunter 16. Jul 2018 10:53

AW: JSONValue ändern
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1407371)
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;

Tja, RemovePair funktioniert, AddPair nicht. Das Endergebnis ist dann um den betreffenden Wert ärmer. Eine Fehlermeldung gibts nicht, es passiert "einfach nur nix". :-(

TiGü 16. Jul 2018 11:02

AW: JSONValue ändern
 
Zitat:

Zitat von Codehunter (Beitrag 1407387)
Tja, RemovePair funktioniert, AddPair nicht. Das Endergebnis ist dann um den betreffenden Wert ärmer. Eine Fehlermeldung gibts nicht, es passiert "einfach nur nix". :-(

Im reinen Consolen-Testprojekt geht es doch?
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.

Uwe Raabe 16. Jul 2018 11:04

AW: JSONValue ändern
 
Zitat:

Zitat von TiGü (Beitrag 1407388)
Im reinen Consolen-Testprojekt geht es doch?

Kann ich bestätigen.

Der schöne Günther 16. Jul 2018 11:09

AW: JSONValue ändern
 
Langsam bekomme ich das Gefühl dass in "Tokyo" wieder ordentlich gedreht wurde damit einem nicht langweilig wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz