Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:27 Uhr.
Seite 2 von 3     12 3      

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