![]() |
JSon Formatieren
Unter XE wäre das eine Lösung.
Delphi-Quellcode:
Habe aber kein XE sondern D2010..
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. Hat vielleicht jemand dafür eine Praktikable Lösung um JSon zu formatieren? Meine Datei sieht als Bsp. so aus. Zitat:
gruss |
AW: JSon Formatieren
![]() Die Lösung mit der SynCommons.pas aus dem mORMot-Framework scheint mir ein gangbarer Weg zu sein. |
AW: JSon Formatieren
Zitat:
Danke. gruss |
AW: JSon Formatieren
Zitat:
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. |
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.
|
AW: JSon Formatieren
Ich lade kein Framework mit 25MB nur um JSon zu formatieren.
Dann lass ich es so wie es ist. Zitat:
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 |
AW: JSon Formatieren
![]() - 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 |
AW: JSon Formatieren
Zitat:
DUnitTestRunner gibt es nicht (vom Test Projekt) Kann ich also vorher nicht prüfen ob es für mich verwendbar ist. gruss |
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? Oder einfach versuchst mit dem Quellcode des obige Beispiel, das du selbst gepostet hast, zum laufen zu bekommen? |
AW: JSon Formatieren
Zitat:
Zitat:
Ansonsten wäre das natürlich genau das was ich brauchte string übergeben und fertig. gruss |
AW: JSon Formatieren
Zitat:
Die Projekthomepage wäre das: ![]() Zitat:
Das es nicht ohne diese geht, sollte dir wohl klar sein. |
AW: JSon Formatieren
Ansonsten schau mal bei mir vorbei:
![]() Der Code zum Formatieren ist relativ abgekapselt. Solltest du dir leicht rauskopieren und für
Delphi-Quellcode:
adaptieren können :)
Rest.JSON
Nvm, D2010 hat nichtmal Rest.JSON. Sorry. |
AW: JSon Formatieren
Zitat:
|
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:
anwende.
ClonedObj.SaveToFile(TxtFile);
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 |
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:
Ist nicht schön, jedoch gibt es zumindestens mit deinen Beispielen etwas schön formatiertes heraus.
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; 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.. ;) |
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 |
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. |
AW: JSon Formatieren
Zitat:
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:
@HolgerX
// Format Json
lutf8 := UTF8String(FormatJSONStr(string(lutf8))); lstream.Position := 0; lstream.WriteBuffer(lutf8[1], length(lutf8)); Herzlichen Dank. so sieht es jetzt aus mehr wollte ich nicht ;)
Code:
gruss
{
"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" } ] } |
AW: JSon Formatieren
Habs jetzt nicht ganz gelesen was du möchtest.
Hilft dir ![]() Bin jetzt nicht sicher ob das die aktuellste Version ist, es gibt da noch einige Forks. Rollo |
AW: JSon Formatieren
Zitat:
Da muss man kein Framework oder eine separate Library für verwenden. Ich musste nur einen String ins Json Format formatieren. trotzdem Danke. gruss |
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. |
AW: JSon Formatieren
Zitat:
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; |
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 |
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 |
AW: JSon Formatieren
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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