Autor Beitrag
UweK
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53
Erhaltene Danke: 1

Win 7
Delphi Enterprise XE6
BeitragVerfasst: Mi 11.06.25 09:40 
Hallo allerseits,

Ich bekomme von einem Server den json String
ausblenden 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
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Gestern um 10:06 
Ich würde dir sehr superobject ans Herz legen:
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:
ausblenden 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:
ausblenden 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:
github.com/onryldz/x...ter/XSuperObject.pas