Entwickler-Ecke

Sonstiges (Delphi) - json String zerlegen für Anfänger


UweK - Mi 11.06.25 09:40
Titel: json String zerlegen für Anfänger
Hallo allerseits,

Ich bekomme von einem Server den json String

Delphi-Quelltext
1:
[2,0,{"Status":OK},{"Zeit":123.456}]                    

Wie kann ich den in ein json Objekt einladen und dann auf die einzelnen Werte zugreifen? Kann mir dafür bitte jemand mal ein Beispiel aufschreiben?

Im Netz gibt es Beispiele mit TJSONObject.Parse, aber die machen über den Offset nur etwas mit den Paaren ab der ersten geschweiften Klammer. An den Einzelwert zu Beginn komme ich damit anscheinend nicht ran.
Im Delphi-Help sieht TJSONArray sinnvoll aus, in Hinblick auf die eckigen Klammern und die Komma-Aufzählung dazwischen. Aber dort gibt es kein Parse.

Vielen Dank für Tipps!
Gruß Uwe


Moderiert von user profile iconTh69: Topic aus Delphi Tutorials verschoben am So 15.06.2025 um 10:30


jaenicke - Do 12.06.25 10:06

Ich würde dir sehr superobject ans Herz legen:
https://github.com/hgourvest/superobject

Leider ist dein geposteter Text kein valides JSON. Das liegt am String OK, dem die Anführungszeichen fehlen. (Bist du sicher, dass das genau so ankommt?)

SuperObject verarbeitet das allerdings, soweit ich mich entsinne, dennoch. Daher sollte das gehen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
uses
  superobject;

var
  JsonValue: ISuperObject;
  ArrayValues: TSuperArray;
begin
  JsonValue := SO('[2,0,{"Status":OK},{"Zeit":123.456}]');
  ArrayValues := JsonValue.AsArray;
  ShowMessage(ArrayValues[0].AsString);
  ShowMessage(ArrayValues[1].AsString);
  ShowMessage(ArrayValues[2]['Status'].AsString);
  ShowMessage(ArrayValues[3]['Zeit'].AsDouble.ToString);

// oder in Kurzschreibweise:
  ShowMessage(ArrayValues.S[0]);
  ShowMessage(ArrayValues.S[1]);
  ShowMessage(ArrayValues[2].S['Status']);
  ShowMessage(ArrayValues[3].D['Zeit'].ToString);

Mit den integrierten Möglichkeiten ginge es so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
uses
  System.JSON;

var
  JsonArray: TJSONArray;
  StatusObj, ZeitObj: TJSONObject;
begin
  JsonArray := TJSONObject.ParseJSONValue('[2, 0, {"Status": OK}, {"Zeit": 123.456}]'as TJSONArray;
  try
    ShowMessage(JsonArray.Items[0].AsType<string>);
    ShowMessage(JsonArray.Items[1].AsType<string>);
    StatusObj := JsonArray.Items[2as TJSONObject;
    ShowMessage(StatusObj.GetValue<string>('Status'));
    ZeitObj := JsonArray.Items[3as TJSONObject;
    ShowMessage(ZeitObj.GetValue<Double>('Zeit').ToString);
  finally
    JsonArray.Free;
  end;
Aber das dürfte nicht gehen, weil das JSON nicht valide ist.

Es gibt auch noch:
https://github.com/onryldz/x-superobject/blob/master/XSuperObject.pas