JSON in TListBox parsen

8

Guten Abend Jungs!

Ich versuche gerade einen CloudFlare Client für den Desktop zu erstellen. Ich habe eine Verbindung zu ihrer API hergestellt und die JSON-Ergebnisse erfolgreich mit einer POST-Anforderung abgerufen (deren Ergebnisse in einem TMemo ausgegeben wurden). Ich möchte nun diese Ergebnisse in TListBox analysieren (siehe zum Beispiel den fettgedruckten Bereich). Das Projekt wird in Firemonkey erstellt.

Hier ist das formatierte Layout der Antwort mit einigem Beispielinhalt;

%Vor%

Ich habe mehrere verschiedene Komponenten ausprobiert - SuperObject , Paweł Głowackis JSON Designtime Parser , Tiny-JSON , LKJSON und die eingebaute DBXJSON. Allerdings habe ich überhaupt keine Erfahrung mit JSON und ich kann nicht die grundlegendsten Beispiele finden, von denen ich anfangen kann. Viele von ihnen zeigen Beispieldaten, aber alle, die ich ausprobiert habe, scheinen nicht so zu funktionieren, wie ich es erwarte, wahrscheinlich weil ich sie falsch verstehe. Ich würde annehmen, dass die Komponenten funktionieren, also brauche ich Anleitung, um anzufangen.

Es gibt hunderte, oft tausende von Ergebnissen im ips "array" (ich entschuldige mich, wenn das nicht korrekt ist, ich würde annehmen, dass es als Array bekannt ist, aber ich bin wieder völlig neu in JSON) / p>

Was ich wirklich suche, ist eine Art extrem einfacher Beispielcode, aus dem ich bauen kann (zusammen mit der Komponente, die zum Parsen verwendet wird und so).

Wenn ich zum Beispiel jedes ip aus den JSON-Ergebnissen holen und jedes als separates Element in ein TListBox (mit TListBox.add -Methode) setzen möchte, wie würde ich das erreichen? das?

Wenn ich ip sage, meine ich den Wert (im oben formatierten Layout wäre dies xxx.xxx.xxx.xxx oder yyy.yyy.yyy.yyy ).

Zusätzlich, wenn ich einen "Datensatz" (?) nach seiner IP aus den JSON-Ergebnissen finden und die Daten in ein Delphi-Array ausgeben wollte - z.B.;

%Vor%

ist das mit JSON möglich? (Wenn dies als eine separate Frage oder zu unzusammenhängend angesehen wird, können Sie es gerne bearbeiten, anstatt die Frage als Ganzes zu schließen.)

Das nächste, was ich dazu hatte, waren nicht nur die IPs, sondern auch alle anderen Daten in einem separaten TListItem (also response , ips , ip , classification , xxx.xxx.xxx.xxx und alles andere) sonst hätte es seinen eigenen Gegenstand, zusammen mit einigen leeren Gegenständen zwischen jedem nicht leeren Gegenstand).

Ich bin mir sicher, dass das sehr einfach ist, aber es gibt so viele Informationen über JSON, dass es für Leute, die mit dem Format nicht vertraut sind, etwas überwältigend ist.

Mit freundlichen Grüßen, Scott Pritchard.

    
Scott Pritchard 16.07.2012, 19:47
quelle

2 Antworten

8

JSON ist sehr einfach und leicht zu verstehen, sobald Sie die grundlegenden Konzepte verstanden haben. Schauen Sie sich Ссылка an, wo es die Dinge erklärt.

Es gibt 4 grundlegende Konzepte in JSON:

Ein Wert ist ein beliebiges JSON-Element: eine grundlegende Zeichenfolge oder Zahl, ein Array oder ein Objekt. (Alles außer einem Paar .)

Ein Array sollte ein vertrautes Konzept sein: eine geordnete Liste von Werten. Der Hauptunterschied zu Delphi-Arrays besteht darin, dass JSON-Arrays keinen definierten Typ für die Elemente haben. Sie sind einfach "ein Array von JSON-Werten".

Ein Paar ist ein Schlüssel / Wert-Paar. Der Schlüssel kann eine Zeichenfolge oder eine Zahl sein und der Wert kann ein beliebiger JSON-Wert sein.

Ein Objekt ist eine assoziative Abbildung von JSON-Paaren. Sie können es sich konzeptionell als TDictionary<string, JSON value> vorstellen.

Wenn ich also ein JSON-Array von Daten wie dieses nehmen und in eine TListBox schreiben wollte, würde ich so etwas tun (DBXJSON-Beispiel, Warnung: nicht getestet):

%Vor%

Dann haben Sie eine Liste von IP-Adressen und zugehörigen Objekten, die den vollständigen Datensatz enthalten, den Sie erhalten können, wenn der Benutzer einen auswählt. (Wenn Sie den gesamten Inhalt jedes Datensatzes in das Listensteuerelement einfügen möchten, sehen Sie sich TListView an. Das funktioniert besser als TListBox .)

Und wenn Sie ein Array von Strings erstellen möchten, die alle Werte enthalten, tun Sie etwas wie folgt:

%Vor%

Das ist natürlich nur ein Beispielcode, aber es sollte Ihnen etwas geben, auf das Sie aufbauen können.

    
Mason Wheeler 16.07.2012, 23:01
quelle
1

EDIT2: AV mit extremer Leichtigkeit behoben.

BEARBEITEN: Nachdem ich meinen eigenen Code weiter untersucht hatte, erkannte ich, dass dies eine Menge Speicherlecks verursachen würde. Allerdings habe ich seit dem Wechsel zu SuperObject und festgestellt, dass das gleiche Ergebnis in 2 Zeilen Code mit nur 2 Variablen und keine Speicherverluste erreicht werden kann;

%Vor%

RetrievedJSON ist einfach ein string , das den nicht geklärten JET im Klartext enthält (d. h. nicht ein JSONString , sondern eine tatsächliche Zeichenkette).

Ich habe den ursprünglichen Code aus Gründen der Kontinuität unten gelassen.

Mit Hilfe von Mason Wheeler in einer früheren Antwort, sowie eine Antwort von "teran" auf Frage 9608794 , habe ich erfolgreich Folgendes erstellt, um auf die tatsächliche Ebene (dh das" Array "mit den Daten) zu analysieren, auf die ich zugreifen musste, und gab dann alle Elemente mit einem bestimmten Wert aus JSONString.Value in ein Listenfeld (im folgenden Beispiel LB1 genannt);

%Vor%

Obwohl dies eine extrem runde Art ist, es zu tun, erlaubt es mir, jeden einzelnen Schritt zu betrachten, und zu sehen, wo es durch den JSON und mit extremer Leichtigkeit hinuntergeht, und es in eine Funktion zu verwandeln, wo ich kann Ausgabe eines Stücks oder einer Reihe von Daten als Ergebnis basierend auf einem von mehreren Kriterien. Um zu überprüfen, ob ich die richtige Anzahl von Items bekommen habe, habe ich am Ende 2 ShowMessage routinen hinzugefügt; Eine für die Elemente in der Listbox und eine für die Anzahl der Instanzen von "ip" -Daten, die ich analysiert habe.

Dieser Code wurde speziell in FireMonkey mit CloudFlare API JSON-Ergebnissen getestet, die genau wie sie abgerufen wurden in einem TMemo ausgegeben wurden (bei einem &calls_left&a=zone_ips&class=t&geo=1 API Aufruf, natürlich mit Ihrem zone , token und email zusätzlich angehängt). Es sollte relativ einfach sein, es zu ändern, um mit anderen Ergebnissen aus den zahlreichen anderen API-Aufrufen zu arbeiten.

Um klarzustellen, ich habe Masons Code versucht, aber leider konnte ich es nicht zum Laufen bringen. Allerdings habe ich seine Antwort vorerst mit der Begründung akzeptiert, dass die Erklärung, die er zu den Grundlagen gegeben hat, es wert war und mir geholfen hat, zu einer Endlösung zu kommen und etwas zu entwickeln, aus dem ich bauen und mich selbst unterrichten kann / p>     

Scott Pritchard 17.07.2012 17:55
quelle