AGB  ·  Datenschutz  ·  Impressum  







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

JSon Formatieren

Ein Thema von EWeiss · begonnen am 24. Feb 2018 · letzter Beitrag vom 4. Nov 2021
Antwort Antwort
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
982 Beiträge
 
Delphi 6 Professional
 
#1

AW: JSon Formatieren

  Alt 24. Feb 2018, 14:57
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..
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: JSon Formatieren

  Alt 24. Feb 2018, 15:17
Sieht sehr gut aus Danke..

Frage..
Was spricht gegen
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#3

AW: JSon Formatieren

  Alt 24. Feb 2018, 15:26
Vorm Schreiben Position vom Stream auf 0 setzen: Stream.Position := 0;
Oder eventuell den Stream vorm Schreiben leer machen: 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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: JSon Formatieren

  Alt 24. Feb 2018, 15:52
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

Geändert von EWeiss (24. Feb 2018 um 18:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:45 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-2025 by Thomas Breitkreuz