Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi JSon Formatieren (https://www.delphipraxis.net/195387-json-formatieren.html)

EWeiss 24. Feb 2018 10:41

JSon Formatieren
 
Unter XE wäre das eine Lösung.
Delphi-Quellcode:
program jsonformatter;
 
{$APPTYPE CONSOLE}
 
{$R *.res}
 
uses
  System.SysUtils,
  rest.json,
  system.json;
 
var
  LJSONObject : TJSONObject;
  jsonString : String;
  resultStr : String;
begin
  try
    jsonString := '{"menu": { "id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", "onclick": "CreateNewDoc()"},{"value": "Open", "onclick": "OpenDoc()"},{"value": "Close", "onclick": "CloseDoc()"}]}}}';
    LJSONObject := TJSONObject.ParseJSONValue(TEncoding.UTF8.GetBytes(jsonString), 0) as TJSONObject;
    resultStr := REST.Json.TJson.Format(LJSONObject);
    writeln(resultStr);
    readln;
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.
Habe aber kein XE sondern D2010..
Hat vielleicht jemand dafür eine Praktikable Lösung um JSon zu formatieren?

Meine Datei sieht als Bsp. so aus.
Zitat:

{"page":1,"total_results":6,"total_pages":1,"resul ts":[{"vote_count":13,"id":23114,"video":false,"vote_av erage":6.6,"title":"Der kleine Lord","popularity":4.214607,"poster_path":"\/nHScGmwreC5JuAKUZYr9gEhkkU8.jpg","original_languag e":"en","original_title":"Little Lord Fauntleroy","genre_ids":[18,10751],"backdrop_path":"\/hREgoyvqKnCgNg7AJwRvDhuWX1G.jpg","adult":false,"ov erview":"Seit dem Tod seines englischen Vaters lebt der junge Cedric allein mit seiner Mutter in Brooklyn. Eines Tages erhält er Nachricht von seinem Großvater, dem Earl von Dorincourt, der seinerzeit Cedrics Vater wegen der Heirat mit Cedrics Mutter verstoßen hatte. Cedric ist der einzige lebende Nachkomme des Earls und soll nun bei ihm auf sein Erbe vorbereitet werden. Auch die Mutter darf mit nach England reisen, muss aber unter den Hausangestellten leben. Schon bald schließt der alte Earl den ebenso intelligenten wie höflichen Cedric ins Herz. Doch da meldet unerwartet eine andere Partei Ansprüche auf das Erbe an.","release_date":"1936-03-06"},{"vote_count":44,"id":38602,"video":false,"vo te_average":7,"title":"Der kleine Lord","popularity":4.176422,"poster_path":"\/9YAN1UW0ziDojl65Ou2cJbieZOo.jpg","original_languag e":"en","original_title":"Little Lord Fauntleroy","genre_ids":[10770,10751,18],"backdrop_path":"\/8T59a0IHQBLXZ5s18tycclL5vT.jpg","adult":false,"ove rview":"Der siebenjährige Cedric Errol lebt mit seiner amerikanischen Mutter in sehr bescheidenen Verhältnissen. Eines Tages taucht ein Mann auf und erklärt, dass Cedric der einziger Erbe des Titels und Vermögens seines Großvaters ist. Cedric soll den Titel Lord Fauntleroy erhalten und im Schloss des Großvaters leben und erzogen werden.","release_date":"1980-11-25"},{"vote_count":0,"id":374369,"video":false,"vo te_average":0,"title":"Der kleine Lord","popularity":1.001648,"poster_path":null,"or iginal_language":"de","original_title":"Der kleine Lord","genre_ids":[10751],"backdrop_path":null,"adult":false,"overview":"Ei n deutsches Film-Drama","release_date":"1962-12-24"},{"vote_count":1,"id":377104,"video":false,"vo te_average":5,"title":"Der Kleine Lord","popularity":1.053292,"poster_path":null,"or iginal_language":"it","original_title":"Il Piccolo Lord","genre_ids":[],"backdrop_path":null,"adult":false,"overview":"De r elfjährige Christian lebt mit seiner italienischen Mutter Gioia in armen Verhältnissen auf der Insel Ischia. Sein deutscher Vater starb während eines Rettungseinsatzes noch bevor Christian auf die Welt kam. Der freundliche Junge hatte ein unauffälliges und ruhiges Leben, bis ihn eines Tages sein Großvater Carl Schneibel findet. Carl Schneibel ist ein reicher Geschäftsmann, der Christian noch nie zuvor zu Gesicht bekommen hat. Da der alte einsame Mann keinen Erben hat, entscheidet er, dass er Christian aufnimmt und ihm eine gute Ausbildung zukommen lässt. Da er auch nie einer Meinung mit seinem Sohn und der Wahl seiner Frau war, entscheidet er, dass Gioia nicht mitkommen kann. Trotzdem will Gioia nicht dem Glück ihres Sohnes im Weg stehen und lässt ihn gehen. Dank seines großes Herzens und seiner netten Art gewinnt Christian das Herz seines Großvaters und verändert sein komplettes Leben","release_date":"1996-12-18"},{"vote_count":1,"id":377137,"video":false,"vo te_average":6,"title":"Der Kleine Lord - Retter in der Not","popularity":1.036868,"poster_path":"\/nvxeajudLFNXD7cPj4oCOVg7DAy.jpg","original_languag e":"it","original_title":"Il Ritorno del piccolo lord","genre_ids":[],"backdrop_path":null,"adult":false,"overview":"Ch ristian lebt seit dem Tod seines Vaters bei seinem Großvater, dem wohlhabenden Brauerei-Betreiber Carl Schneibel. Gemeinsam verbringen Großvater und Enkel die Ferien auf der Insel Ischia bei Christians italienischer Mama Gioia. Carl lernt dort die charmante Veronica kennen und lädt sie arglos ins heimische Schlösschen in Bayern. Was er nicht ahnt: Veronica ist eine international gesuchte Betrügerin, die den Unternehmer durch geschickte Computer-Manipulationen nach und nach um sein gesamtes Vermögen bringt. Verbittert und verarmt reist Carl erneut nach Ischia, um sich von dem Schock zu erholen. Enkel Christian nutzt derweil seinerseits die Möglichkeiten des Internets, um Veronica dingfest zu machen.","release_date":"2000-12-15"},{"vote_count":0,"id":109537,"video":false,"vo te_average":0,"title":"Entführt","popularity":1.87 3076,"poster_path":"\/9d7Zul9qSmQDrgTRfdM9YEMvh0d.jpg","original_languag e":"en","original_title":"Kidnapped","genre_ids ":[12,18],"backdrop_path":"\/4sHgdXFkakJjclm8mBgcRkWWYao.jpg","adult":false,"ov erview":"Handlung: Nach dem Tod seines Vaters sucht der junge David Balfour (FREDDIE BARTHOLOMEW) seinen Onkel Ebenezer (MILES MANDER), einen alten und kauzigen Mann auf, um bei ihm zu leben. Weil die Brüder so unterschiedlich erscheinen, forscht David nach seiner Herkunft und erfährt, daß das Anwesen eigentlich seinem Vater gehörte, doch noch bevor David sein Recht einfordern kann, läßt ihn Ebenezer entführen und verschleppen. Zwischen all den gefährlichen Männern an Bord, bringt es David unter vielen Gefahren zum Kabinensteward, als man nach einer Kollision den Schotten Alan Breck (WARNER BAXTER) aus der See fischt, der nach Schottland zurück will...","release_date":"1938-05-27"}]}
Das kann aber niemand vernünftig lesen.

gruss

DeddyH 24. Feb 2018 11:18

AW: JSon Formatieren
 
https://stackoverflow.com/questions/...json-in-delphi
Die Lösung mit der SynCommons.pas aus dem mORMot-Framework scheint mir ein gangbarer Weg zu sein.

EWeiss 24. Feb 2018 11:29

AW: JSon Formatieren
 
Zitat:

Zitat von DeddyH (Beitrag 1394565)
https://stackoverflow.com/questions/...json-in-delphi
Die Lösung mit der SynCommons.pas aus dem mORMot-Framework scheint mir ein gangbarer Weg zu sein.

Das scheint mir aber ein Part eines Framework zu sein und alleine wird sie wohl nicht funktionieren.
Danke.

gruss

Bernhard Geyer 24. Feb 2018 11:34

AW: JSon Formatieren
 
Zitat:

Zitat von EWeiss (Beitrag 1394566)
Zitat:

Zitat von DeddyH (Beitrag 1394565)
https://stackoverflow.com/questions/...json-in-delphi
Die Lösung mit der SynCommons.pas aus dem mORMot-Framework scheint mir ein gangbarer Weg zu sein.

Das scheint mir aber ein Part eines Framework zu sein und alleine wird sie wohl nicht funktionieren.

Schon ausprobiert? Und was stört daran das nicht nur eine JSON-Unit sondern ein paar Units für RTTI/Extended RTTI gezogen werden.
Du wirst nicht das ganze Framework in deine Exe reinkompilieren müssen.

Wenn man schon eine solche antike Delphi-Version im Einsatz hat, muss man halt damit leben das zu nutzen was noch dafür entwickelt wird.

DeddyH 24. Feb 2018 11:39

AW: JSon Formatieren
 
In so einem Fall binde ich die entsprechende Unit einfach ein und schaue mir die Compiler-Fehler an. Die fehlenden Units binde ich dann ebenfalls ein, im Normalfall sind das nur eine Handvoll. Alternativ (wenn ich nur eine einzige Routine brauche) kopiere ich den entsprechenden Code einfach heraus (mit einem Kommentar, wo es herkommt), ggf. mit weiteren benötigten Routinen. Das ist üblicherweise kein großer Aufwand.

EWeiss 24. Feb 2018 11:42

AW: JSon Formatieren
 
Ich lade kein Framework mit 25MB nur um JSon zu formatieren.
Dann lass ich es so wie es ist.

Zitat:

Zitat von DeddyH (Beitrag 1394568)
In so einem Fall binde ich die entsprechende Unit einfach ein und schaue mir die Compiler-Fehler an. Die fehlenden Units binde ich dann ebenfalls ein, im Normalfall sind das nur eine Handvoll. Alternativ (wenn ich nur eine einzige Routine brauche) kopiere ich den entsprechenden Code einfach heraus (mit einem Kommentar, wo es herkommt), ggf. mit weiteren benötigten Routinen. Das ist üblicherweise kein großer Aufwand.

Jo das könnte ich mal versuchen.

EDIT:
Kein Chance.. die Unit scheint die Base für das Framework zu sein und ist nebenbei 2,5MB groß.
Das auseinander zu pflücken ist zu viel aufwand.

gruss

mensch72 24. Feb 2018 11:49

AW: JSon Formatieren
 
https://github.com/ahausladen/JsonDataObjects
- das ist ab D2009... wird also mit D2010 wohl funktionieren:)
- von Mr. Hausladen, kompakt und abgeschlossen und der weiß definitiv was in Delphi gut funktioniert und was man besser nicht macht

EWeiss 24. Feb 2018 12:10

AW: JSon Formatieren
 
Zitat:

Zitat von mensch72 (Beitrag 1394570)
https://github.com/ahausladen/JsonDataObjects
- das ist ab D2009... wird also mit D2010 wohl funktionieren:)
- von Mr. Hausladen, kompakt und abgeschlossen und der weiß definitiv was in Delphi gut funktioniert und was man besser nicht macht

Danke und jain..
DUnitTestRunner gibt es nicht (vom Test Projekt)
Kann ich also vorher nicht prüfen ob es für mich verwendbar ist.

gruss

Bernhard Geyer 24. Feb 2018 12:17

AW: JSon Formatieren
 
Zitat:

Zitat von EWeiss (Beitrag 1394572)
Danke und jain..
DUnitTestRunner gibt es nicht (vom Test Projekt)
Kann ich also vorher nicht prüfen ob es für mich verwendbar ist.

Hmmmm.:gruebel:

Wie wäre es dann wenn dir das DUnit-Framework auch herunter lädst, wenn du die Verwendbarkeit über die Unit-Tests prüfen willst?

Oder einfach versuchst mit dem Quellcode des obige Beispiel, das du selbst gepostet hast, zum laufen zu bekommen?

EWeiss 24. Feb 2018 12:23

AW: JSon Formatieren
 
Zitat:

Wie wäre es dann wenn dir das DUnit-Framework auch herunter lädst, wenn du die Verwendbarkeit über die Unit-Tests prüfen willst?
Hätte ich es nicht von Mr. Hausladen herunter geladen könnte ich nicht behaupten das es nicht läuft oder?

Zitat:

Oder einfach versuchst mit dem Quellcode des obige Beispiel, das du selbst gepostet hast, zum laufen zu bekommen?
Weil ich kein DX habe und somit über rest.json und system.json nicht verfüge.

Ansonsten wäre das natürlich genau das was ich brauchte string übergeben und fertig.

gruss

Bernhard Geyer 24. Feb 2018 12:52

AW: JSon Formatieren
 
Zitat:

Zitat von EWeiss (Beitrag 1394574)
Hätte ich es nicht von Mr. Hausladen herunter geladen könnte ich nicht behaupten das es nicht läuft oder?

Das DUnit-Framework ist ein anderes Projekt da du andersweitig herunter laden musst. Das ist beim JSON-Projekt nicht dabei.
Die Projekthomepage wäre das: http://dunit.sourceforge.net/. Ob du diese direkt verwenden kannst oder für D2010 irgend einen der Forks bei Sourceforge oder gibhub benötigst weiß ich nicht.


Zitat:

Weil ich kein DX habe und somit über rest.json und system.json nicht verfüge.
Natürlich mit Anpassungen an die verfügbaren Klassen der gerade herunter geladenen Bibliothek.
Das es nicht ohne diese geht, sollte dir wohl klar sein.

Zacherl 24. Feb 2018 13:09

AW: JSon Formatieren
 
Ansonsten schau mal bei mir vorbei:
https://github.com/flobernd/delphi-u...Utils.JSON.pas

Der Code zum Formatieren ist relativ abgekapselt. Solltest du dir leicht rauskopieren und für
Delphi-Quellcode:
Rest.JSON
adaptieren können :)

Nvm, D2010 hat nichtmal Rest.JSON. Sorry.

Bernhard Geyer 24. Feb 2018 13:18

AW: JSon Formatieren
 
Zitat:

Zitat von Zacherl (Beitrag 1394577)
Ansonsten schau mal bei mir vorbei:
https://github.com/flobernd/delphi-u...Utils.JSON.pas

Der Code zum Formatieren ist relativ abgekapselt. Solltest du dir leicht rauskopieren und für
Delphi-Quellcode:
Rest.JSON
adaptieren können :)

Nvm, D2010 hat nichtmal Rest.JSON. Sorry.

Dann bleibt wohl nur noch irgendwelche "Monster"-Frameworks dich auch einen JSON-Parser haben.

EWeiss 24. Feb 2018 13:49

AW: JSon Formatieren
 
Habe mal das von Mr. Hausladen versucht.
Er Formatiert JSon wenn auch nicht so wie ich es gerne möchte inklusive einrücken, also alles untereinander.

Wenn ich aber
Delphi-Quellcode:
ClonedObj.SaveToFile(TxtFile);
anwende.

Ist der Text genauso wie zuvor unformatiert.
Eigentlich sollte doch dann der Text formatiert geschrieben werden so wie es formatiert wurde.
Delphi-Quellcode:
ShowMessage(ClonedObj.ToJSON(False));


irgendwie ist mir nicht klar wie ich die Message jetzt in die Textdatei bekomme. (bin wohl neben der Rolle)


gruss

HolgerX 24. Feb 2018 14:57

AW: JSon Formatieren
 
Hmm..

Es geht doch nur darum, einen JSON-Text (String) so zu formatieren, dass er lesbar eingerückt und umgebrochen wird?

Hab das mal eben recht einfach als eine simple Funktion erstellt:

Delphi-Quellcode:
function FormatJSONStr(AString : string):String;
var
  idx : integer;
  InStr : boolean;
  i : integer;
begin
  Result := '';
  idx := 0;
  InStr := false;
  For i := 1 to length(AString) do begin
    if not InStr then begin
      if AString[i] in [']','}'] then begin
        inc(idx, -1);
        Result := Result + #13#10 + StringOfChar(#9 , idx);
      end;
    end;
    Result := Result + AString[i];
    if AString[i] = '"' then begin
      if (i > 1) and (AString[i-1] <> '/') then InStr := not InStr;
    end;
    if not InStr then begin
      if AString[i] in [','] then begin
        Result := Result + #13#10 + StringOfChar(#9 , idx);
      end;
      if AString[i] in ['{','['] then begin
        Inc(idx);
        Result := Result + #13#10 + StringOfChar(#9 , idx);
      end;
    end;
  end;
end;
Ist nicht schön, jedoch gibt es zumindestens mit deinen Beispielen etwas schön formatiertes heraus.
Es berücksichtigt auch, das die Sonderzeichen (,[]{}") auch in JSON-Strings vorhanden sein können.

Es wurde mit D6 erstellt, so dass für XE noch das 'String in []' gegen (ich glaube) CharInStr ausgetauscht werden sollte...
Hab kein XE und konnte es somit nicht probieren.. ;)

EWeiss 24. Feb 2018 15:17

AW: JSon Formatieren
 
Sieht sehr gut aus ;) Danke..

Frage..
Was spricht gegen
Delphi-Quellcode:
function FormatJSONStr(AString : UTF8String): UTF8String;


Habe aber beim schreiben der Datei noch ein Problem.

Ich öffne die Datei mit TFileStream und fmOpenReadWrite das hat zur folge das dein formatierter Text angehängt und nicht den alten vollständig ersetzt.
Wie kann ich beim Stream erreichen das der Text vollständig ersetzt wird.

Das geht ja nur über fmOpenWrite oder?
Kann ich aber nicht verwenden da ich diese ja vorher einlesen muss.

gruss

Delphi.Narium 24. Feb 2018 15:26

AW: JSon Formatieren
 
Vorm Schreiben Position vom Stream auf 0 setzen:
Delphi-Quellcode:
Stream.Position := 0;

Oder eventuell den Stream vorm Schreiben leer machen:
Delphi-Quellcode:
Stream.Clear;

HolgerX schrieb den Quelltext mit D6, da war UTF8String noch nicht "normal".
Es spricht für Dich eigentlich nix gegen die entsprechende Änderung, sie dürfte sogar eher zielführend sein.

EWeiss 24. Feb 2018 15:52

AW: JSon Formatieren
 
Zitat:

HolgerX schrieb den Quelltext mit D6, da war UTF8String noch nicht "normal".
Ok habe es als string belassen macht keinen großen Unterschied.
Habe aber "in" mit CharInSet ersetzt.

Delphi-Quellcode:
function TTheMDB.FormatJSONStr(AString: string): string;
var
  idx : integer;
  InStr : boolean;
  i : integer;
begin

  Result := '';
  idx := 0;
  InStr := false;

  for i := 1 to length(AString) do
  begin
    if not InStr then
    begin
      if CharInSet(AString[i], [']','}']) then
      begin
        inc(idx, -1);
        Result := Result + #13#10 + StringOfChar(#9 , idx);
       end;
    end;

    Result := Result + AString[i];

    if AString[i] = '"' then
      if (i > 1) and (AString[i-1] <> '/') then
        InStr := not InStr;

    if not InStr then
    begin
      if CharInSet(AString[i], [',']) then
        Result := Result + #13#10 + StringOfChar(#9 , idx);

      if CharInSet(AString[i], ['{','[']) then
      begin
        Inc(idx);
        Result := Result + #13#10 + StringOfChar(#9 , idx);
      end;
    end;
  end;
end;
Delphi-Quellcode:
// Format Json
lutf8 := UTF8String(FormatJSONStr(string(lutf8)));
lstream.Position := 0;
lstream.WriteBuffer(lutf8[1], length(lutf8));
@HolgerX
Herzlichen Dank.

so sieht es jetzt aus mehr wollte ich nicht ;)
Code:
{
   "page":1,
   "total_results":1,
   "total_pages":1,
   "results":[
      {
         "vote_count":1810,
         "id":346672,
         "video":false,
         "vote_average":5.3,
         "title":"Underworld: Blood Wars",
         "popularity":18.494246,
         "poster_path":"\/v1nYlTaYPhVbdnfnp7VPl9wyV9U.jpg",
         "original_language":"en",
         "original_title":"Underworld: Blood Wars",
         "genre_ids":[
            28,
            14,
            27
         ],
         "backdrop_path":"\/PIXSMakrO3s2dqA7mCvAAoVR0E.jpg",
         "adult":false,
         "overview":"Vampir-Kriegerin Selene findet sich nach ihrem langjährigen Koma in einer Welt wieder, in der Menschen von der Existenz von Vampiren und Werwölfen wissen und mit allen Mitteln versuchen, beide Clans auszuradieren. Zwar konnte Selene ihre Hybrid-Tochter Eve mithilfe von David zuletzt aus der Gefangenschaft befreien, doch das heißt noch lange nicht, dass die Jagd auf ihre Rasse damit ein Ende gefunden hat. Darüber hinaus denkt Lykaner-Anführer Marius noch längst nicht an eine Aussöhnung ihrer Clans, nur weil beide übernatürlichen Spezies zur Zielscheibe geworden sind. Kann es Selene, David und dessen Vater Thomas gelingen, den ewigen Krieg zwischen Werwölfen und Vampiren zu beenden?",
         "release_date":"2016-11-28"
      }
   ]
}
gruss

Rollo62 25. Feb 2018 05:33

AW: JSon Formatieren
 
Habs jetzt nicht ganz gelesen was du möchtest.
Hilft dir das JSON SuperObject weiter ?

Bin jetzt nicht sicher ob das die aktuellste Version ist, es gibt da noch einige Forks.

Rollo

EWeiss 25. Feb 2018 06:56

AW: JSon Formatieren
 
Zitat:

Habs jetzt nicht ganz gelesen was du möchtest.
Das Problem ist erledigt und dank der Hilfe von HolgerX mit 30 > Zeilen Code erledigt.
Da muss man kein Framework oder eine separate Library für verwenden.
Ich musste nur einen String ins Json Format formatieren.

trotzdem Danke.

gruss

sh17 19. Jul 2018 10:58

AW: JSon Formatieren
 
Ich kram es nochmal raus.

Wie kann ich mit Delphi Tokyo Bordmitteln einen JSON-String formatieren und de-formatieren (alle Whitespaces etc wieder entfernen)?

TJson.JsonToObject kommt nämlich nur mit unformatieren Daten zurecht. Ich möchte den JSON-String aber dem Benutzer zum Bearbeiten anbieten, was nur formatiert Sinn macht.

TiGü 19. Jul 2018 12:34

AW: JSon Formatieren
 
Zitat:

Zitat von sh17 (Beitrag 1407868)
Ich kram es nochmal raus.

Wie kann ich mit Delphi Tokyo Bordmitteln einen JSON-String formatieren und de-formatieren (alle Whitespaces etc wieder entfernen)?

TJson.JsonToObject kommt nämlich nur mit unformatieren Daten zurecht. Ich möchte den JSON-String aber dem Benutzer zum Bearbeiten anbieten, was nur formatiert Sinn macht.

Delphi-Quellcode:
 
var
 MyJSONString, MyFormattedJSONString: string;
 JsonValue: TJSONValue;
begin
...

      MyJSONString := RESTResponse.Content;
      Memo1.Lines.Add(MyJSONString);
      JsonValue := TJSONObject.ParseJSONValue(MyJSONString);
      if Assigned(JsonValue) then
      begin
        MyFormattedJSONString := REST.Json.TJSON.Format(JsonValue);
        Memo1.Lines.Add(MyFormattedJSONString);
...
        // und wieder zurück
        MyJSONString := MyFormattedJSONString.Replace(sLineBreak, '').Replace(' ', '');
        Memo1.Lines.Add(MyJSONString);
      end;

hemmingway 28. Okt 2021 10:56

AW: JSon Formatieren
 
Für die formatierte Ausgabe mit Bordmitteln geht auch folgendes:

var Export := TExport.Create; // Das zu exportierende Object
var m := TJSONMarshal.Create(TJSONConverter.Create);
var SerializedExport := m.Marshal(Export) as TJSONObject;
var JSONString := SerializedExport.ToString;
SerializedExport.Free;

JSONString := StringReplace(JSONString, '\\', '', [rfReplaceAll]);
JSONString := StringReplace(JSONString, '"{', '{', [rfReplaceAll]);
JSONString := StringReplace(JSONString, '\"', '"', [rfReplaceAll]);
JSONString := StringReplace(JSONString, '\{', '{', [rfReplaceAll]);
JSONString := StringReplace(JSONString, '}"', '}', [rfReplaceAll]);

var memo := TStringList.Create;
memo.Text := JSONString;
memo.savetofile('d:\temp\export.json');
memo.free;
Export.Free;

Mit einem Viewer (z.B. den JSON Viewer von MITEC) lassen sich so auch komplexere Strukturen anzeigen.
Das ganze geht aber nur, wenn die ersetzten Strings nicht in den Daten vorhanden sind. Ein direktes Wiedereinlesen mit Unmarshal von TJSONObject ist nicht möglich.

Viele Grüße, Bernhard

hemmingway 4. Nov 2021 09:17

AW: JSon Formatieren
 
for var i := 1 to JSONString.Length do
begin
if JSONString[i] = '\' then
begin
if (JSONString[i+1] <> '\') and (JSONString[i+1] <> '"') then
JSONString[i] := #1;
end;
end;
JSONString := StringReplace(JSONString, '\', '', [rfReplaceAll]);
JSONString := StringReplace(JSONString, #1, '\\', [rfReplaceAll]);
JSONString := StringReplace(JSONString, '"{', '{', [rfReplaceAll]);
JSONString := StringReplace(JSONString, '}"', '}', [rfReplaceAll]);

Mit dieser Variante kann man ein einzelnes \ in Pfadangaben retten.

Viele Grüße, Bernhard

venice2 4. Nov 2021 09:45

AW: JSon Formatieren
 
Das Thema ist schon seit 3 Jahren erledigt.
Danke.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 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