AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

JSONValue ändern

Ein Thema von Codehunter · begonnen am 16. Jul 2018 · letzter Beitrag vom 16. Jul 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#1

JSONValue ändern

  Alt 16. Jul 2018, 10:05
Delphi-Version: 10.2 Tokyo
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: JSONValue ändern

  Alt 16. Jul 2018, 10:17
Das value/foo-Paar entfernen und ein neues hinzufügen?

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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: JSONValue ändern

  Alt 16. Jul 2018, 10:18
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: JSONValue ändern

  Alt 16. Jul 2018, 10:29
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: JSONValue ändern

  Alt 16. Jul 2018, 10:33
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
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: JSONValue ändern

  Alt 16. Jul 2018, 11:22
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
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: JSONValue ändern

  Alt 16. Jul 2018, 11:53
Das value/foo-Paar entfernen und ein neues hinzufügen?

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".
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: JSONValue ändern

  Alt 16. Jul 2018, 12:02
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#9

AW: JSONValue ändern

  Alt 16. Jul 2018, 12:04
Im reinen Consolen-Testprojekt geht es doch?
Kann ich bestätigen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: JSONValue ändern

  Alt 16. Jul 2018, 12:09
Langsam bekomme ich das Gefühl dass in "Tokyo" wieder ordentlich gedreht wurde damit einem nicht langweilig wird.

Geändert von Der schöne Günther (16. Jul 2018 um 12:10 Uhr) Grund: Uwe war schneller
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:18 Uhr.
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