Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   JSON Wert lesen (https://www.delphipraxis.net/206578-json-wert-lesen.html)

IMPEGA 8. Jan 2021 10:48

JSON Wert lesen
 
Ich versuche vergeblich 3 Werte aus "art" lesen. (Bin nur ein Hobbyprogrammieren)
"id": "829",
"status": "1",
"changed": "2020-16-28 11:41:26"

Ohne diesen Array, komme ich mit JSON klar, sobald es geschachtelt wird kriege ich ständig Fehler.
Ich kann den zweiten Array nicht auslesen.

Mein JSON String
Code:
{
   "js":{
      "today":"67",
      "old":14,
      "selected_item":1,
      "data":[
         {
            "nr":"525",
            "name":"crane",
            "number":"26",
            "service_id":"723851235",
            "logo":"15.png",
            "art":[
               {
                  "id":"829",
                  "shelf":"12",
                  "status":"1",
                  "changed":"2020-16-28 11:41:26"
               }
            ],
            "use_logo":"1"
         },
         {
            "nr":"528",
            "name":"poetry",
            "number":"26",
            "service_id":"723851235",
            "logo":"15.png",
            "art":[
               {
                  "id":"829",
                  "shelf":"12",
                  "status":"1",
                  "changed":"2020-16-28 11:41:26"
               }
            ],
            "use_load_balancing":"1"
         }
      ]
   }
}

Das wäre mein normaler Fall
Code:
{
    "js": [
        {
            "id": "*",
            "name": "crane",
            "nr": "528",
            "service_id": "723851235",
            "logo": "15.png",
            "status": "1",
            "changed": "2020-16-28 11:41:26",
            "number": 56
        },
        {
            "id": "107",
            "name": "poetry",
            "nr": "358",
            "service_id": "6599235",
            "logo": "395.png",
            "status": "1",
            "changed": "2020-16-29 13:17:11",
            "number": 182
        }
    ]
}
So lese ich die Daten aus:
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var
  ID : string;
  Status : string;
  Changed : string;
  JSonValue : TJSonValue;
  JsonArray : TJSONArray;
  ArrElement : TJSonValue;
begin
  JsonValue := TJsonObject.ParseJSONValue(Memo5.Text) as TJSONObject;
  JsonValue := (JsonValue as TJSONObject).Get('js').JSONValue;
    if (JSONValue is TJSONArray) then
      begin
        JSONArray := JsonValue as TJSONArray;
          for ArrElement in JSONArray do
            begin
              ID  := ArrElement.GetValue<string>('id');
              Status := ArrElement.GetValue<string>('status');
              Changed := ArrElement.GetValue<string>('changed');
            end;
      end;
end;
Sobald ich in den Unterbereich "art" greifen will, bekomme ich ständig Fehler.
Ich poste hier kein Muster wie ich es versucht habe, weil es sehr viel Versuche waren. :)
Kann mir Jemand unter die Arme greifen? Wäre supi.

DeddyH 8. Jan 2021 11:03

AW: JSON Wert lesen
 
Welche Art denn? Sowohl data als auch art sind jeweils JSON-Arrays mit 0 bis X Elementen, demzufolge kann es auch 0 bis X Arten geben.

[edit] Hilft Dir das hier weiter? Nur schnell heruntergeschludert, normalerweise würde ich das auf mehrere Parsing-Methoden herunterbrechen.
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  lJSON: TJSONObject;
  lInnerJSON: TJSONObject;
  Arr: TJSONArray;
  lInnerArr: TJSONArray;
  lArt: TJSONObject;
  Value: TJSONValue;
  i, j: integer;
  lID: string;
  lStatus: string;
  lChanged: string;
begin
  // Das gesamte JSON-Objekt
  lJSON := TJSONObject.ParseJSONValue(Memo1.Text) as TJSONObject;
  try
    Value := lJSON.Values['js'];
    if Assigned(Value) and (Value is TJSONObject) then
      begin
        // Das js-Objekt
        lInnerJSON := TJSONObject(Value);
        Value := lInnerJSON.Values['data'];
        if Assigned(Value) and (Value is TJSONArray) then
          begin
            // Das data-Array
            Arr := TJSONArray(Value);
            for i := 0 to Arr.Count - 1 do
              if Arr.Items[i] is TJSONObject then
                begin
                  // Die einzelnen Objekte im data-Array
                  lInnerJSON := TJSONObject(Arr.Items[i]);
                  Value := lInnerJSON.Values['art'];
                  if Assigned(Value) and (Value is TJSONArray) then
                    begin
                      // Das art-Array je data-Objekt
                      lInnerArr := TJSONArray(Value);
                      for j := 0 to lInnerArr.Count - 1 do
                        if lInnerArr.Items[j] is TJSONObject then
                          begin
                            // Das gesuchte Objekt innerhalb des art-Arrays
                            lArt := TJSONObject(lInnerArr.Items[j]);
                            if not lArt.TryGetValue<string>('id', lID) then
                              lID := '';
                            if not lArt.TryGetValue<string>('status', lStatus)
                            then
                              lStatus := '';
                            if not lArt.TryGetValue<string>('changed', lChanged)
                            then
                              lChanged := '';
                            ShowMessage
                              (Format('ID: %s, Status: %s, Changed: %s',
                              [lID, lStatus, lChanged]));
                          end;
                    end;
                end;
          end;
      end;
  finally
    lJSON.Free;
  end;
end;
[/edit]

IMPEGA 8. Jan 2021 11:54

AW: JSON Wert lesen
 
Ui..., das ging aber schnell. Super. Vielen Dank.
An meinem Muster funktioniert es sehr gut.

Das wird auch in meinem Projekt funktionieren. Du hast mir das perfekt vorgemacht.
Darum ging es mir auch. Den Rest kann ich mir schon selbst aufbauen, da ist nämlich noch mehr was Probleme bereitet.
Nun habe ich einen Ansatz wie es zu realisieren ist.
Das reicht mir vollkommen. Ein wenig mitdenken muss ich ja auch. Sonst hätte es keinen Sinn.

Noch Mal. VIELEN DANK.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz