Parsen von JSON in TListBox
Guten Abend Jungs!
Ich bin gerade dabei, zusammen eine CloudFlare
- client für den desktop. Ich habe eine Verbindung mit Ihrem API und erfolgreich abgerufenen JSON-Ergebnisse mit einer POST-Anfrage (von denen die Ergebnisse ausgegeben wurden, in eine TMemo
). Ich bin jetzt zu wollen, zu analysieren, diese Ergebnisse in eine TListBox
(siehe Fett gedruckten Bereich, zum Beispiel). Das Projekt wird entwickelt in Firemonkey
.
Hier der formatierte layout der Reaktion mit einigen Beispiel-Inhalten;
{
- response: {
|- ips: [
|- {
ip: "xxx.xxx.xxx.xxx",
classification: "threat",
hits: xx,
latitude: null,
longitude: null,
zone_name: "domain-example1"
},
- {
ip: "yyy.yyy.yyy.yyy",
classification: "robot",
hits: yy,
latitude: null,
longitude: null,
zone_name: "domain-example2"
}
]
}
result : "success",
msg: null
}
Ich habe versucht, mehrere verschiedene Komponenten - SuperObject, Paweł Głowacki ist JSON Entwurfszeit-Parser, Tiny-JSON, LKJSON und die eingebauten DBXJSON. Ich habe allerdings keine Erfahrung mit JSON und ich kann nicht scheinen zu finden, die einfachsten Beispiele, die ich bekommen kann begann. Viele von Ihnen zeigen Beispiel-Daten, aber alle die, die ich ausprobiert habe scheinen nicht zu funktionieren wie ich es erwarten würde, wahrscheinlich, weil ich Missverständnisse Ihnen. Ich würde davon ausgehen, die Komponenten arbeiten, so brauche ich Anleitung auf erste Schritte.
Gibt es Hunderte, oft Tausende von Ergebnissen in der ips
"array" (ich entschuldige mich, wenn das nicht korrekt ist, würde ich davon ausgehen, es ist bekannt als ein array aber wieder, ich bin komplett neu in JSON).
Was ich wirklich Suche, ist eine Art von extrem basic-Beispielcode, die ich bauen kann, aus der (zusammen mit, welche Komponente Sie verwendet für die Analyse und so).
Zum Beispiel, wenn ich wollte, greifen jeden ip
aus der JSON-Ergebnisse, und legen Sie jedes als ein separates Element in einem TListBox
(mit TListBox.add
- Methode), wie würde ich mich über das erreichen?
Wenn ich sage ip
meine ich den Wert (in der formatierten layout vor, das wäre xxx.xxx.xxx.xxx
oder yyy.yyy.yyy.yyy
).
Außerdem, wenn ich finden wollte, einen "Datensatz" (?) indem es die IP von der die JSON-Ergebnisse und die Ausgabe der Daten auf ein delphi-array - z.B.;
Result : Array of String = ['"xxx.xxx.xxx.xxx"','"threat"','xx','null','null','"domain-example1"'];
geht das mit JSON? (Wenn dies gesehen wird, als eine separate Frage oder auch nichts zu tun haben, bitte fühlen Sie sich frei, um es zu Bearbeiten, anstatt die Frage schließen als ganzes).
Der nächste, den ich bekam zu dieser hatte nicht nur die ip, aber jedes andere Stück von Daten in einem separaten TListItem
(d.h. response
, ips
, ip
, classification
, xxx.xxx.xxx.xxx
und alles andere hatte, ist es eigener Artikel, zusammen mit mehreren leeren Elementen in zwischen jedes nicht-leere Element).
Ich bin mir sicher, dass es ist extrem einfach zu tun, aber es gibt so viel Informationen über JSON dass es ein wenig überwältigend für Leute die neu sind im format.
Beste Grüße,
Scott Pritchard.
Du musst angemeldet sein, um einen Kommentar abzugeben.
JSON ist sehr einfach und leicht zu verstehen, sobald Sie verstehen die grundlegenden Konzepte. Haben Sie einen Blick auf http://json.org, wo es etwas erklärt.
Gibt es 4 grundlegende Konzepte in JSON:
Einen Wert ist jedes JSON-element: ein einfacher string oder eine Zahl, ein array oder ein Objekt. (Aber alles andere als ein paar.)
Einer array sollte einem vertrauten Konzept: eine geordnete Liste von Werten. Der wesentliche Unterschied zu Delphi-arrays ist, dass JSON-arrays, die nicht über einen benutzerdefinierten Typ für die Elemente; Sie sind einfach "ein array von JSON-Werte."
Einen paar ist ein Schlüssel-Wert-paar. Der key kann ein string oder eine Zahl und der Wert kann eine beliebige JSON-Wert.
Einer Objekt ist ein assoziatives anzeigen von JSON-Paare. Man kann es begrifflich als
TDictionary<string, JSON value>
.Also, wenn ich wollte ein JSON-array von Daten, wie Sie, und steckte es in eine TListBox, ich würde so etwas tun (DBXJSON Beispiel, Achtung: nicht getestet):
Dann haben Sie eine Liste von IP-Adressen und den zugehörigen Objekten mit dem vollständigen Datensatz, den Sie bekommen können, wenn der Benutzer wählt einen. (Wenn man wollte den gesamten Inhalt der einzelnen Datensätze in der Liste kontrollieren, haben Sie einen Blick auf
TListView
. Es funktioniert besser alsTListBox
für dass.)Und wenn Sie möchten, erstellen Sie ein array von Zeichenfolgen, die alle Werte, etwas wie das hier tun:
Ist dies alles nur Beispiel-code, natürlich, aber es sollte Ihnen etwas auf zu bauen.
TMemo
- und als solche kann nicht herausfinden, wie dielines.text
dies in derJSONObject
Reaktion erforderlich, die durch die Prozedur. Auchips := pair.value as TJSONArray
zurückE2015 - Operator not applicable
.TJSONObject.Parse
. Und diese Linie sollte wahrscheinlichpair.JsonValue
statt. Mein schlechtes.System.JSON
unit in Ihrer uses-Klausel, damit das Beispiel funktioniertEDIT2: AV-Fest mit extremer Leichtigkeit.
EDIT: Nach weiteren untersuchen meinem eigenen code, der ich realisierte, dass es würde dazu führen, eine riesige Menge von Speicher-Lecks. Allerdings habe ich seit der Umstellung auf
SuperObject
gefunden und das gleiche Ergebnis kann erreicht werden, in 2 code-Zeilen mit nur 2 Variablen und keine Speicherverluste;RetrievedJSON
ist einfach einstring
mit der ungeparsten, Klartext JSON (also nichtJSONString
aber eine tatsächliche Zeichenfolge).Ich habe den original-code unterhalb aus Gründen der Kontinuität.
Mit Hilfe von Mason Wheeler in einer früheren Antwort, sowie die Antwort zur Verfügung gestellt von "teran" auf Frage 9608794 ich erfolgreich gebaut, die folgenden zu analysieren nach unten, um die aktuelle Ebene (z.B. die "array" mit den Daten), die ich brauchte, um den Zugriff und die Ausgabe aller Elemente mit einem bestimmten
JSONString.Value
in einer listbox (namensLB1
im Beispiel unten);Dies ist zwar eine extrem Runde über Art und Weise, es zu tun, es erlaubt mir zu Aussehen bei jedem einzelnen Schritt und sehen, wo es Durchlaufen nach unten durch den JSON und mit extremer Leichtigkeit, und ändern Sie es in eine Funktion, wo ich die Ausgabe jedes Stück oder eine Reihe von Daten als ein Ergebnis aus einer von mehreren Kriterien. Zum Wohle der überprüfung bekam ich die richtige Anzahl der Elemente, die ich Hinzugefügt 2
ShowMessage
Routinen am Ende, Eine für die Elemente in der listbox, und eine für die Anzahl der Instanzen der "ip" - Daten, dass ich-Analyse.Dieser code wurde speziell getestet in Firemonkey mit CloudFlare-API-JSON-Ergebnisse wurden die Ausgabe in eine
TMemo
genau so, wie Sie abgerufen wurden (auf eine&calls_left&a=zone_ips&class=t&geo=1
API-Aufruf, natürlich mitzone
,token
undemail
angehängt ... zusätzlich). Es sollte relativ leicht sein, ihn zu ändern, um andere Ergebnisse von den zahlreichen anderen API-Aufrufe zu.Zu klären, ich habe versucht, Mason ' s code, aber leider ich konnte es nicht funktioniert. Allerdings habe ich akzeptierte seine Antwort vorerst auf der Grundlage, dass die Erklärung, die er gab, auf die Grundlagen, die würdig war es und unterstützt mich in immer um eine end-Lösung und kommt mit sowas kann ich aufbauen und mich lehren.