Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   JSON in DataSet (https://www.delphipraxis.net/202415-json-dataset.html)

Ykcim 31. Okt 2019 14:15

JSON in DataSet
 
Hallo Zusammen,

ich versuche gerade meine erste Client - Server Application zu erstellen. Ich nutze dazu xData von TMS und komme auch schon recht weit.

Ich habe einen Server erstellt, der die Abfragen ausführt. Er liefert als Ergebnis einen JSON-Stream zurück.
Delphi-Quellcode:
Query_Main.SaveToStream(AStream, sfJSON);

In der VCL-Umgebung kann ich diesen Stream in eine TFDMemTable einlesen
Delphi-Quellcode:
Table_Abteilung.LoadFromStream(LStream, sfJSON);
und dann mit einem DataSource zur Verfügung stellen. Das klappt auch sehr gut.
Für eine WEB_Aplication müsste ich das Ganze in ein DataSet versuchen zu bringen. Und dabei scheiter ich leider.

Delphi-Quellcode:
procedure TFrmMain.btnAbteilungClick(Sender: TObject);
   procedure OnResponse(Response: TXDataClientResponse);
   begin
      XDS_Abteilung.SetJsonData(TJSArray(TJSObject(Response.Result)['value']));
      XDS_Abteilung.Open;
   end;
begin
   XMyClient.RawInvoke('IData_xChangeService.Get_Abteilung',[], @OnResponse);
end;
Angeblich müsste es so funktionieren. Aber der Wert 'value' liefert null zurück. Ich muss wahrscheinlich einen anderen angeben. Trotz großer Mühe und Suche finde ich nicht heraus, wie der Pfad aussehen muss.

Hier der JSON-Stream:
Code:
{"FDBS":
   {"Version":15,"Manager":
      {"UpdatesRegistry":true,"TableList":[
         {"class":"Table","Name":"Query_Main","SourceName":"abteilung","SourceID":1,"TabID":0,"EnforceConstraints":false,"MinimumCapacity":50,"ColumnList":[
            {"class":"Column","Name":"AbteilungsID","SourceName":"AbteilungsID","SourceID":1,"DataType":"UInt32","Precision":10,"Searchable":true,"AllowNull":true,"AutoInc":true,"Base":true,"AutoIncrementSeed":-1,"AutoIncrementStep":-1,"OAllowNull":true,"OInWhere":true,"OInKey":true,"OAfterInsChanged":true,"OriginTabName":"nedcom2.abteilung","OriginColName":"AbteilungsID","SourcePrecision":10},
            {"class":"Column","Name":"Abteilung","SourceName":"Abteilung","SourceID":2,"DataType":"AnsiString","Size":45,"Searchable":true,"AllowNull":true,"Default":true,"Base":true,"OAllowNull":true,"OInUpdate":true,"OInWhere":true,"OAfterInsChanged":true,"OriginTabName":"nedcom2.abteilung","OriginColName":"Abteilung","SourceSize":45},
            {"class":"Column","Name":"Test","SourceName":"Test","SourceID":3,"DataType":"AnsiString","Size":45,"Searchable":true,"AllowNull":true,"Default":true,"Base":true,"OAllowNull":true,"OInUpdate":true,"OInWhere":true,"OAfterInsChanged":true,"OriginTabName":"nedcom2.abteilung","OriginColName":"Test","SourceSize":45}],
         "ConstraintList":[],"ViewList":[],"RowList":[
            {"RowID":0,"Original":
               {"AbteilungsID":10,"Abteilung":"Verkauf","Test":"0"}
            },
            {"RowID":1,"Original":
               {"AbteilungsID":20,
                "Abteilung":"Anwendung & Entwicklung",
                "Test":"0"}
            },
            {"RowID":2,"Original":
               {"AbteilungsID":30,
                "Abteilung":"Technische Büro",
                "Test":"0"}
            },
            {"RowID":3,"Original":
               {"AbteilungsID":40,
                "Abteilung":"Arbeitsvorbereitung",
                "Test":"0"}
            },
            {"RowID":4,"Original":
               {"AbteilungsID":50,
                "Abteilung":"Produktion",
                "Test":"0"}
            }]
         }],
      "RelationList":[]}
   }
}
Kann mir irgendjemand einen Schups geben? Entweder das ich den Pfad erkennen kann oder wie man den Stream anderweitig in ein DataSet bekommt?

Vielen Dank
Patrick

DeddyH 31. Okt 2019 14:18

AW: JSON in DataSet
 
Ich kann in dem ganzen JSON kein Array namens value finden.

Ykcim 31. Okt 2019 14:24

AW: JSON in DataSet
 
Ja, das ist mir bewusst. Ich habe das in der Doku immer wieder gefunden, dass ich erst dachte, dass wäre eine reservierte Bezeichnung. Dann bin ich hingegangen und habe alle möglichen Variationen versucht. Wenn ich das in der Doku über JSON richtig verstanden habe, dann muss ich quasi einen Pfad der innerhalb des Streams zu den gewünschten Daten führt angeben.
Aber wie sähe der hier aus???

Ich finde auch nirgends die Eigenschaft "array", wie ich es in anderen Beispielen von JSON-Dateien gesehen habe...

Vielen Dank
Patrick

DeddyH 31. Okt 2019 14:32

AW: JSON in DataSet
 
Ich habe von XData keine Ahnung, aber wenn ich es richtig sehe, ist der strukturelle Aufbau Deines JSON folgendermaßen:
Code:
Hauptobjekt
-> FDBS
  -> Manager
    -> TableList
      -> ColumnList (Array)
      -> ConstraintList (Array)
      -> ViewList (Array)
      -> RowList (Array)
      -> RelationList (Array)

Ykcim 31. Okt 2019 14:40

AW: JSON in DataSet
 
ok, das hilft mir, das JSON besser zu verstehen!

Ich habe es jetzt so versucht:
Delphi-Quellcode:
XDS_Abteilung.SetJsonData(TJSArray(TJSObject(Response.Result)['FDBS.Manager.Tablelist.RowList']));


Leider klappt es noch nicht...
ErrorMessage: Cannot read property 'FDBS.Manager.Tablelist.RowList' of null at OnResponse

Wie wird dieser "Pfad" (['FDBS.Manager.Tablelist.RowList']) überlicherweise angegeben?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 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