L'analyse JSON dans TListBox
Bonne soirée les gars!
Je suis en train d'essayer de mettre un CloudFlare
client pour le bureau. Je l'ai connecté à leur API et extrait avec succès les résultats JSON avec une requête POST (dont les résultats ont été de sortie dans un TMemo
). Je suis maintenant à vouloir analyser ces résultats dans un TListBox
(voir la zone en caractères gras par exemple). Le projet est conçu dans Firemonkey
.
Voici la mise en forme mise en page de la réponse avec des exemples de contenu;
{
- 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
}
J'ai essayé plusieurs différentes composantes - SuperObject, Paweł Głowacki JSON moment de la Conception de l'Analyseur, Minuscule-JSON, LKJSON et les construit dans DBXJSON. Cependant, je n'ai aucune expérience avec JSON à tous et je n'arrive pas à trouver la plus élémentaire des exemples que je peux commencer à partir. Beaucoup d'entre eux montrent les données de l'échantillon, mais toutes celles que j'ai essayé ne semblent pas fonctionner comme je l'avais espérer, probablement parce que je suis un malentendu. Je suppose que tous les composants fonctionnent correctement, j'ai donc besoin de conseils sur la prise en main.
Il y a des centaines, souvent des milliers de résultats dans le ips
"array" (je m'excuse si ce n'est pas correct, je suppose que c'est connu comme un tableau, mais encore une fois, je suis complètement nouveau pour JSON).
Ce que je suis vraiment à la recherche d'une sorte de très de base exemple de code qui permet de créer à partir d' (avec ce composant, il utilise pour l'analyse et l').
Par exemple, si je voulais prendre toutes les ip
du JSON résultats, et de mettre chacun comme un élément distinct dans un TListBox
(à l'aide de TListBox.add
méthode), comment pourrais-je aller sur la réalisation de cet?
Quand je dis ip
, je veux dire la valeur (dans la mise en forme mise en page ci-dessus, ce serait xxx.xxx.xxx.xxx
ou yyy.yyy.yyy.yyy
).
En outre, si je voulais trouver un "record" (?) par IP à partir du JSON résultats et de sortie les données de delphi tableau - par exemple;
Result : Array of String = ['"xxx.xxx.xxx.xxx"','"threat"','xx','null','null','"domain-example1"'];
est-ce possible avec JSON? (Si cela est perçu comme une question séparée ou trop indépendants, n'hésitez pas à le modifier plutôt que de fermer l'ensemble de la question).
Le plus proche je suis arrivé à ce qui n'a pas seulement l'ip, mais chaque morceau de données dans un autre TListItem
(c'est à dire response
, ips
, ip
, classification
, xxx.xxx.xxx.xxx
et tout le reste avait son propre élément, ainsi que plusieurs éléments vides entre chaque non-vide).
Je suis sûr que c'est extrêmement simple à faire, mais il y a tellement d'informations sur JSON que c'est un peu écrasante pour les personnes nouvelles dans le format.
Meilleures Salutations,
Scott Pritchard.
OriginalL'auteur Scott Pritchard | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
JSON est très simple et facile à comprendre, une fois que vous comprenez les concepts de base. Jetez un oeil à http://json.org, où il explique les choses.
Il y a 4 concepts de base en JSON:
Un valeur est tout JSON élément de base d'une chaîne ou un nombre, un tableau ou un objet. (Mais en tout cas, paire.)
Un tableau devrait être un concept familier: une liste ordonnée de valeurs. La principale différence de Delphes, de tableaux est que JSON tableaux n'ont pas de type défini pour les éléments; ils sont simplement "un tableau JSON valeurs."
Un paire est une paire clé-valeur. La clé peut être une chaîne ou un nombre, et la valeur peut être n'importe quelle valeur JSON.
Un objet est associatif carte de JSON paires. Vous pouvez penser conceptuellement comme une
TDictionary<string, JSON value>
.Donc, si je voulais prendre un tableau JSON de données comme ça, et le mettre dans un TListBox, je ferais quelque chose comme ceci (DBXJSON exemple, attention: pas testé):
Alors vous avez une liste d'adresses IP, et les objets associés contenant le dossier complet que vous pouvez obtenir si l'utilisateur sélectionne un. (Si vous voulais mettre la totalité du contenu de chaque enregistrement dans la liste de contrôle, ont un oeil à
TListView
. Il fonctionne mieux queTListBox
.)Et si vous voulez construire un tableau de chaînes contenant toutes les valeurs, de faire quelque chose comme ceci:
C'est tout simplement un exemple de code, bien sûr, mais il devrait vous donner quelque chose à construire.
TMemo
et en tant que telle ne peut pas comprendre comment placer leslines.text
de cette dans leJSONObject
réponse requise par la procédure. Aussi,ips := pair.value as TJSONArray
retourneE2015 - Operator not applicable
.Jetez un oeil à
TJSONObject.Parse
. Et cette ligne devrait probablement utiliserpair.JsonValue
à la place. Mon mauvais.Pour référence future (et toute autre personne à la recherche pour elle), vous devez inclure les
System.JSON
unité dans votre clause uses pour que cet exemple fonctionneOriginalL'auteur Mason Wheeler
EDIT2: AV Fixe avec une extrême facilité.
EDIT: Après examen plus approfondi de mon propre code, j'ai réalisé qu'il serait la cause d'une énorme quantité de fuites de mémoire. Cependant, depuis, j'ai changé pour
SuperObject
et a trouvé le même résultat peut être obtenu en 2 lignes de code avec seulement 2 variables et pas de fuites de mémoire;RetrievedJSON
est tout simplement unstring
contenant le unparsed, en clair JSON (c'est à dire pas unJSONString
mais une chaîne réelle).J'ai laissé l'original du code-dessous par souci de continuité.
Avec l'aide de Mason Wheeler dans une précédente réponse, ainsi qu'une réponse à "teran" sur question 9608794, j'ai construit avec succès le suivant pour analyser le bas pour le niveau réel (c'est à dire le "tableau" contenant les données) j'avais besoin de l'accès, et alors la sortie de tous les éléments avec un
JSONString.Value
dans une listbox (nomméLB1
dans l'exemple ci-dessous);Alors que c'est un très rond manière de faire, il me permet de regarder à chaque étape, et de voir où c'est l'itération vers le bas à travers le JSON et avec une extrême facilité, et de les changer en une fonction où je peux sortir n'importe quel morceau ou la plage de données comme un résultat basé sur l'un des nombreux critères. Pour l'amour de la vérification j'ai reçu le bon nombre d'éléments, j'ai ajouté 2
ShowMessage
routines à la fin; Un pour les éléments de la listbox, et un pour le nombre d'occurrences de "propriété intellectuelle" des données que j'étais de l'analyse.Ce code a été testé dans Firemonkey avec CloudFlare API JSON résultats qui étaient sortie en
TMemo
exactement comme ils ont été récupérés (sur un&calls_left&a=zone_ips&class=t&geo=1
appel d'API, bien sûr, avec votrezone
,token
etemail
ajouté en plus). Il devrait être relativement facile à modifier pour qu'il fonctionne avec d'autres résultats de nombreux autres appels de l'API de trop.Pour clarifier, j'ai essayé de Maçon code, mais malheureusement je ne pouvais pas le faire fonctionner. Cependant, j'ai accepté sa réponse pour l'heure, sur la base que l'explication qu'il a donné sur les notions de base était digne d'elle et m'a aidé à arriver à une fin-solution et venir avec quelque chose que je peux construire de et apprendre par moi-même.
OriginalL'auteur Scott Pritchard