![]() |
Helper für JSON Objects Framework (System.JSON)
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
nachdem ich gestern in die Verlegenheit kam mit dem - in Delphi integrierten - JSON Objects Framework (System.JSON) zu arbeiten, habe ich mir eine kleine Sammlung an Helper Klassen- und Funktionen geschrieben, um einige Schwächen auszubessern. Generell kann man gut mit dem Framework arbeiten, allerdings haben mich ein paar Dinge enorm gestört:
Delphi-Quellcode:
bzw.
IJSONArrayReader
Delphi-Quellcode:
implementiert. Die Klassen sind Wrapper für
IJSONObjectReader
Delphi-Quellcode:
bzw.
TJSONArray
Delphi-Quellcode:
und implementieren typisierte Read-Operationen auf dem darunterliegenden Objekt. Hierbei wird automatisch der JSON Path mitgeschleppt, um Diesen im Falle einer Typ-Exception in der Meldung mit anzeigen zu können. Zusätzlich zu den trivialen standard JSON-Datentypen habe ich generische Methoden zum Lesen von Enums und Sets implementiert. Sämtlichen Read-Operationen kann zudem ein optionaler Default-Wert mitgegeben werden.
TJSONObject
Komplexe JSON-Datentypen wie Array und Object können ebenfalls gelesen werden, wobei hier eine neue Instanz des entsprechenden Readers zurückgegeben wird, damit man die Aufrufe bei Bedarf auch chainen kann. Analog zu den Reader-Klassen gibt
Delphi-Quellcode:
und
IJSONArrayWriter
Delphi-Quellcode:
mit inverser Funktionalität und einigen Komfort-Funktionen wie konditionales Schreiben von Arrays oder Objekten (ich befand mich öfters in der Situation entweder ein Array schreiben zu wollen, oder aber NULL, wenn das Array keine Elemente enthielt).
IJSONObjectWriter
Um das Problem der Formatierung zu lösen, gibt es abschließend die
Delphi-Quellcode:
Methode, welche auch PrettyPrint-Formatting mit einstellbarer Einrückung unterstüzt.
TJSONFormatter.Format
Die aktuellste Version gibt es neben diesem Thread auch immer auf GitHub: ![]() Abschließend noch ein paar Minimalbeispiele:
Delphi-Quellcode:
var
S: String; J: TJSONObject; R: IJSONObjectReader; begin S := '{' + ' "number": 42,' + ' "object": {' + ' "bool": true' + ' },' + ' "array": [' + ' { "str": "Hello" },' + ' { "str": "World" }' + ' ],' + ' "set": [1, 3]' + '}'; J := TJSONObject.ParseJSONValue(S) as TJSONObject; try R := TJSONObjectReader.Create(J); // 42 ShowMessage(R.ReadInteger('number').ToString); // true ShowMessage(R.ReadObject('object').ReadBoolean('bool').ToString); // 'Hello World' ShowMessage( R.ReadArray('array').ReadObject(0).ReadString('str') + ' ' + R.ReadArray('array').ReadObject(1).ReadString('str')); // [akTop, akBottom] R.Reader.ReadSet<TAnchors>('set'); // Exception: "JSON.array[0].oops" is missing or does not contain a valid STRING value." ShowMessage(R.ReadArray('array').ReadObject(0).ReadString('oops')); // 'Default Value' ShowMessage(R.ReadArray('array').ReadObject(0).ReadString('oops', 'Default Value')); finally J.Free; end; end;
Delphi-Quellcode:
Fragen und Anregungen sind wie immer willkommen.
var
J: TJSONObject; W: IJSONObjectWriter; begin J := TJSONObject.Create; try W := TJSONObjectWriter.Create(J); W.WriteInteger('number', 42); W.WriteObject('object').WriteBoolean('bool', true); with W.WriteArray('array') do begin AddObject.WriteString('str', 'Hello'); AddObject.WriteString('str', 'World'); end; // Ordinal values: [1, 3] W.Writer.WriteSet<TAnchors>('set', [akTop, akBottom]); // String values : ["akTop", "akBottom"] W.Writer.WriteSet<TAnchors>('set', [akTop, akBottom], true); // Custom strings: ["top", "bottom"] W.Writer.WriteSet<TAnchors>('set', [akTop, akBottom], ['left', 'top', 'right', 'bottom']); // Writes a new array or "null", if the array does not contain elements W.WriteArrayOrNull('conditional', function(W: TJSONArrayWriter): Boolean begin // Add elements to the new array // ... Result := W.InnerObject.Count > 0; end); finally J.Free; end; end; Viele Grüße Zacherl |
AW: Helper für JSON Objects Framework (System.JSON)
Hab das hier grade entdeckt und lustigerweise grade vorgestern wieder was mit
![]() Falls du davon noch nichts gehört haben solltest: JsonSchema soll für Json Files eine formale Spezifikationsmöglichkeit definieren, die dann geparsed und ausgelesen werden kann. Sie ist selbst über ein JsonSchema spezifiziert (Ja, das ist genau die selbe Idee wie auch bei XML). So wie das ![]() ![]() ![]() Vielleicht kann man dann auch automatisiert DelphiCode aus dem JsonSchema erzeugen, so wie auch bei XML? (Die Idee hatte bestimmt schonmal jemand auch für Delphi, aber vielleicht bringt das hier auch was?) Brighty |
AW: Helper für JSON Objects Framework (System.JSON)
Zitat:
Code Generierung aus einem festen Schema und automatisches (De-)serialisieren liegt momentan allerdings nicht in meinem Fokus, da ich dies für mein aktuelles Projekt nicht anwenden kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:28 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