Comment itérer Tableau JSON et l'extrait de chaque Objet JSON en utilisant GSON?
Ci-dessous est ma Chaîne JSON qui je suis de retour en appelant à partir d'un service de l'API. J'ai raccourcir le bas en ayant seulement trois reportRecords
pour la compréhension but. En général, il pourrait avoir ~500 reportRecords
{
"aggRecords": {
"reportRecords": [
{
"min": 0,
"max": 12,
"avg": 0.3699187,
"count": 246,
"sumSq": 571,
"stddev": 1.4779372,
"median": 0,
"percentileMap": {
"95": 4
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "PostProcessing",
"Type": "PostProcessing"
},
"value": 91
},
{
"min": 0,
"max": 23,
"avg": 2.3991289E-4,
"count": 1463031,
"sumSq": 3071,
"stddev": 0.045814946,
"median": 0,
"percentileMap": {
"95": 0
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "ResourceContext",
"Type": "ResourceContext"
},
"value": 351
},
{
"min": 0,
"max": 1209,
"avg": 1.9203402,
"count": 7344636,
"sumSq": 71832774,
"stddev": 2.4683187,
"median": 2,
"percentileMap": {
"95": 4
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "Client::Sync",
"Type": "Client::Sync"
},
"value": 14104200
}
]
},
"minRecordsMap": {}
}
Maintenant à Partir du dessus de réponse JSON, j'ai besoin d'extraire reportRecords
dont Name
est Client::Sync
. Sens, j'ai besoin de l'extrait ci-dessous reportRecords
à partir du dessus de réponse JSON seulement.
{
"min": 0,
"max": 1209,
"avg": 1.9203402,
"count": 7344636,
"sumSq": 71832774,
"stddev": 2.4683187,
"median": 2,
"percentileMap": {
"95": 4
},
"metricName": "TransactionDuration",
"dimensions": {
"env": "dev",
"pool": "titan",
"Name": "Client::Sync",
"Type": "Client::Sync"
},
"value": 14104200
}
Et maintenant, j'ai besoin d'analyser ci-dessus reportRecords
pour Client::Sync
au-dessous de l'objet
public class DataMetrics {
private String pool;
private String name;
private String type;
private String env;
private String metricName;
private String percentile;
private String median;
private String stdDev;
private String sumSq;
private String count;
private String avg;
private String max;
private String min;
//getters and setters here
}
Ci-dessus variable, des cartes comme celle-ci,
pool is titan
name is Client::Sync
type is Client::Sync
env is dev
metricNname is TransactionDuration
95th percentile is 4
median is 2
stdDev is 2.4683187
sumSq is 71832774
count is 7344636
avg is 1.9203402
max is 1209
min is 0
Je suis à l'aide de GSON bibliothèque ici et ci-dessous est ce que j'ai essayé jusqu'à présent -
private static RestTemplate restTemplate = new RestTemplate();
public static void main(String[] args) {
String jsonLine = restTemplate.getForObject("some_url", String.class);
System.out.println(jsonLine); //here jsonLine will give me above big JSON String
JsonElement jelement = new JsonParser().parse(jsonLine);
JsonObject jobject = jelement.getAsJsonObject();
jobject = jobject.getAsJsonObject("aggRecords");
JsonArray jarray = jobject.getAsJsonArray("reportRecords");
//now how do I iterate JsonArray and get each JSON object
//and then check "name" property of each object, if "Client::Sync" found, read that object for all properties
//and set it using setters.
}
Maintenant, je ne suis pas en mesure de comprendre comment dois-je effectuer une itération JsonArray et de l'extrait de chaque objet JSON à partir d'elle?
- Je suis en train de travailler avec GSON et je suppose que l'exemple ci-dessus, ne pas utiliser de GSON.
- désolé, mon erreur:/
Vous devez vous connecter pour publier un commentaire.
De sorte que vous avez le JsonArray objet avec vos dossiers, voici ce que vous devez faire pour obtenir vos objets fonctionnels:
Alors vous itérer à travers des objets et de filtrer ceux dont vous avez besoin.
Dans java 8, vous pouvez faire ceci:
Cette approche est la conversion de tous les objets et d'itération après, si exactement cette partie de code est critique pour les performances, vous pouvez toujours parcourir en json et de convertir uniquement les objets nécessaires (mais je doute que ce sera effectivement plus rapide que celle décrite ci-dessus).
De toute façon c'est plus facile à maintenir et compréhensible code.
Mise à JOUR:
la même pour java 7:
Vous pouvez analyser tous les objets, puis filtrer ceux qui vous intéressent.
Après que vous avez obtenu jArray, essayez:
Ou si vous souhaitez effectuer une itération json et analyser uniquement requises heres ce que vous pouvez faire:
mais je ne pense pas que c'est effectivement plus rapide que le premier, car dans les deux cas, la conversion de json pour java objet fonctionnel avec analyseur et d'obtenir JsonArray ou quoi que ce soit d'autre. En prenant en considération le fait que les deux sont Googles libs, je suppose que l'analyse de JsonObject spécifiques à certains type de gson est beaucoup plus rapide que de Chaîne (raw json) pour le même type spécifique...
je n'ai pas essayer, mais il peut fonctionner.
////
Objet public getClassFromJsonObject(JSONObject json, Classe myClass){