Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi XML-Schema auswerten (Link) (https://www.delphipraxis.net/203478-xml-schema-auswerten-link.html)

NoGAD 21. Feb 2020 07:04

XML-Schema auswerten (Link)
 
Hallo,


ich habe ein XML-ähnliches Schema (https://www.googleapis.com/books/v1/...s?q=1696290007) und möchte dieses per Code analysieren.

Wichtig sind mir nur einige Werte.

Code:
 "items": [
  {
   "kind": "books#volume",
   "volumeInfo": {
    "title": "Schwungübungen Ab 5 Jahren",
    "subtitle": "Übungsheft Mit Schwungübungen Zur Erhöhung Der Konzentration, Augen-Hand-Koordination Und Feinmotorik. Ideale Vorbereitung Für Kindergarten Und Vorschule!",
    "authors": [
     "Laura Eichelberger"
    ],
    "publishedDate": "2019-09-28",
    "description": "Sie möchten die Konzentration Ihres Kindes fö ...
weiter unten gibt es dann noch interessante Werte, welche jedoch nicht immer vorhanden sind.

Code:
  "imageLinks": {
     "smallThumbnail": "http://books.google.com/books/content?id=DM1JygEACAAJ&printsec=frontcover&img=1&zoom=5&source=gbs_api",
     "thumbnail": "http://books.google.com/books/content?id=DM1JygEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api"
Das ganze ist eine ISBN-Abfrage. Google ist hier die Wahl, weil die meisten Bücher hinterlegt sind.



Meine Frage dazu lautet: Was ist das für ein Schema und gibt es eine einfache Möglichkeit, dieses zu interpretieren - ohne dass ich mit Pos nach Strings suchen muss?

Momentan lese ich das in ein TMemo ein, um damit herumzubasteln.

Danke und LG Mathias

Klaus01 21. Feb 2020 07:20

AW: XML-Schema auswerten (Link)
 
Das Format aus dem Link - sieht für mich nach json aus.
aus SO: https://stackoverflow.com/questions/...ring-in-delphi

Grüße
Klaus

DeddyH 21. Feb 2020 08:09

AW: XML-Schema auswerten (Link)
 
Je nach Delphi-Version kannst Du das mit REST.Json, System.Json oder externen Libs wie SuperObject auswerten.

NoGAD 21. Feb 2020 08:19

AW: XML-Schema auswerten (Link)
 
Danke. Der Link von Klaus hat sehr weitergeholfen.


Code:
JsonValue.GetValue<string>
Die Art der Typdeklaration kenne ich nicht. (<string>)
Wie sah das früher für diesen Fall aus, bevor es diese Art der Zuweisung gab?

Und eine zweite Frage.

Ein Problem mit Arrays habe ich noch. Der JSON Node für diverse Items könnte ein Array sei, so wie es bei Authors ist. Wäre es da nicht gleich einfacher, ich würde generell alle Werte in ein Array einlesen und dieses dann auswerten, auch wenn es nur ein einzelner String ist (wie bei title)?

Doch wie kann ich das Array direkt einlesen - Array of String funktioniert nicht bei der Typdeklaration.


Mein Code sieht nun für Tests wie folgt aus.

Code:
  var
    JSonValue : TJSonValue;
    items : string;
    Authors: TStrings;
  begin

    Memo2.Clear;
    JSonValue := TJSonObject.ParseJSONValue( Memo1.Text );
    items := JSonValue.GetValue< string >( 'items[0].volumeInfo.title' );
    Memo2.Lines.Add( items );
    Authors := JSonValue.GetValue< TStrings >( 'items[0].volumeInfo.authors' );
    Memo2.Lines.AddStrings( Authors );
    items := JSonValue.GetValue< string >( 'items[0].volumeInfo.publishedDate' );
    Memo2.Lines.Add( items );

    JSonValue.Free;
  end;
In der Zeile Authors := erfolgt eine Exception bezüglich Typumwandlung.

jobo 21. Feb 2020 08:23

AW: XML-Schema auswerten (Link)
 
Das Format scheint hier beschrieben zu sein.
https://schema.org/Book

Google bietet ja offenbar eine Api dazu.

Gute Datenbanksysteme erlauben die Abfrage von JSON wie diesem oben unabhängig von individuellen Ausprägungen per SQL.
Dabei kannst Du innerhalb SQL auch gleich Existenz-Prüfungen für Objekte nutzen und so wirklich fehlerfrei Daten abfragen, die vorhanden sind und Dich interessieren.

P.S.: Objekte und Arrays kannst Du damit nahezu beliebig zerlegen und transformieren.

NoGAD 21. Feb 2020 08:29

AW: XML-Schema auswerten (Link)
 
Das Array habe ich gefunden.

Code:
  var
    JSonValue : TJSonValue;
    Authors : TJSONArray;
    Items : string;
    i : Integer;
  begin

    Memo2.Clear;
    JSonValue := TJSonObject.ParseJSONValue( Memo1.Text );
    Items := JSonValue.GetValue< string >( 'items[0].volumeInfo.title' );
    Memo2.Lines.Add( Items );
    Authors := JSonValue.GetValue< TJSONArray >( 'items[0].volumeInfo.authors' );
    for i := 0 to Authors.Size - 1 do
      Memo2.Lines.Add( Authors.Get( i ).Value );
    Items := JSonValue.GetValue< string >( 'items[0].volumeInfo.publishedDate' );
    Memo2.Lines.Add( Items );

    JSonValue.Free;
Damit klappt es.

@jobo: ich gucke es mir an :-)

jobo 22. Feb 2020 10:30

AW: XML-Schema auswerten (Link)
 
Zitat:

Zitat von NoGAD (Beitrag 1458043)
@jobo: ich gucke es mir an :-)

Ich hab Dir ein Beispiel gebaut, das zeigt, was geht bzw. was ich meine. Ist natürlich nicht vollständig und vielleicht nicht anwendbar für Dich, aber einfach sehr bequem (und erprobt).
https://rextester.com/discussion/YNM...json-operators

NoGAD 22. Feb 2020 16:57

AW: XML-Schema auswerten (Link)
 
Hallo Jobo,

das was Du mir da als Link geschickt hast, ist mir zu hoch. Mit Postgres habe ich noch nie zu tun gehabt, ich filtere es momentan anders, ein Beispiel stelle ich später hier rein, wenn es fehlerfrei läuft.

LG Mathias

jobo 23. Feb 2020 07:17

AW: XML-Schema auswerten (Link)
 
Zitat:

Zitat von NoGAD (Beitrag 1458103)
das was Du mir da als Link geschickt hast, ist mir zu hoch.

Das kann ich nicht recht glauben. Du hast wahrscheinlich zu kurz drauf geschaut ;-)
Es ist eine sehr bequeme Art-wenn nicht sogar faule-, JSON zu lesen.

Ohne es verstehen zu müssen: Ein einziges SQL Select Statement liefert Dir alle Felder, die Du aus dem JSON brauchst/haben möchtest, ohne Substring-Krieg und Frickelei.
Ich kenne Deinen Bedarf an Feldern aus dem books Schema nicht, aber ich behaupte, dass man mit einem Select alles auslesen kann, was benötigt wird.
Mein Beispiel enthält natürlich nur 5 Felder und die sind nicht mal alle aus dem books schema.

Ganz generell mal die Anmerkung, dass natürlich mit der Existenz eines Hammers nicht jedes Problem zu einem Nagel gemacht werden kann. Mein Vorschlag SQL zu nutzen macht nur unter bestimmten Bedingungen Sinn. Wenn sowieso SQL genutzt wird, wenn tatsächlich viele oder sehr viel Daten bewegt werden.

Am Ende ist es wahrscheinlich egal, welchen Weg man geht, um JSON zu lesen oder zu schreiben. Die Botschaft ist hauptsächlich, dass man eine geeignete, erprobte Libary/Unit dafür nimmt, statt mit substr usw. zu Fuß rumzueiern. Mein Vorschlag ist hier halt PostgreSQL.

Wenn Dir SQL nicht fremd ist, dann ist Postgres natürlich nicht automatisch an Bord bzw. im Projekt und sicher "Kanonen auf Spatzen". Ich habe es nur genommen, weil es das kann und ich es häufig nutze. Als kleiner, feiner Ersatz könnte auch SQLite dienen. Dessen JSON Funktionen sind aber irgendwie anders gestrickt.

NoGAD 23. Feb 2020 15:32

AW: XML-Schema auswerten (Link)
 
Hallo nochmal,

bisher klappt alles ganz gut, indem ich den json String parse.

Leider habe ich noch ein Problem mit der ersten Variable in der Struktur: items.

Das ist ein Array, von welchem ich die Anzahl der Elemente nicht auslesen kann.

Also so etwas wie

Code:
  var
    JSonObject : TJSONObject;
    JSonValue : TJSonValue;
    Items : TJSonArray;

    TotalItems : Integer;

    Dummy_String : String;
  begin
    Dummy_String := IdHTTP1.Get( Dummy_String );

    JSonObject := TJSONObject.ParseJSONValue( Dummy_String ) as TJSONObject;
    JSonValue := TJSONObject.ParseJSONValue( Dummy_String );

    TotalItems := JSonValue.GetValue< Integer >( 'totalItems' );

    if TotalItems = 0 then
    begin
      ShowMessage( Message_ISBN_NoItems );
      Exit;
    end;

    Items := JSonObject.GetValue< TJSonArray >( 'Items' );
Wie bekomme ich die anzahl der Elemente von Items?

In folgendem Beispiel sind es 10: https://www.googleapis.com/books/v1/...=9783499244551

LG Mathias





Edit:

Habe es gefunden, war eine Blockade ;-)

Code:
    if JSonObject.TryGetValue( 'items', Items ) then
      Items := JSonValue.GetValue< TJSONArray >( 'items' );

    { : Mehrere Items wurden gefunden, in eine Auswahlliste : }
    if Items.Count > 1 then


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:39 Uhr.
Seite 1 von 2  1 2      

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