Je commence tout juste à utiliser json avec Java. Je ne sais pas comment accéder aux valeurs de chaîne dans un JSONArray. Par exemple, mon json ressemble à ceci:
{
"locations": {
"record": [
{
"id": 8817,
"loc": "NEW YORK CITY"
},
{
"id": 2873,
"loc": "UNITED STATES"
},
{
"id": 1501
"loc": "NEW YORK STATE"
}
]
}
}
mon code:
JSONObject req = new JSONObject(join(loadStrings(data.json),""));
JSONObject locs = req.getJSONObject("locations");
JSONArray recs = locs.getJSONArray("record");
J'ai accès à JSONArray "record" à ce stade, mais je ne sais pas comment obtenir les valeurs "id" et "loc" dans une boucle for. Désolé si cette description n'est pas trop claire, je suis un peu nouveau en programmation.
Avez-vous essayé d'utiliser JSONArray.getJSONObject (int) , et JSONArray.length () pour créer votre boucle for:
for (int i = 0; i < recs.length(); ++i) {
JSONObject rec = recs.getJSONObject(i);
int id = rec.getInt("id");
String loc = rec.getString("loc");
// ...
}
Un org.json.JSONArray n'est pas itérable.
Voici comment je traite des éléments dans un net.sf.json.JSONArray :
JSONArray lineItems = jsonObject.getJSONArray("lineItems");
for (Object o : lineItems) {
JSONObject jsonLineItem = (JSONObject) o;
String key = jsonLineItem.getString("key");
String value = jsonLineItem.getString("value");
...
}
Fonctionne très bien... :)
Java 8 est sur le marché après presque deux décennies. Voici comment vous pouvez itérer org.json.JSONArray
avec l’API Java8 Stream.
import org.json.JSONArray;
import org.json.JSONObject;
@Test
public void access_org_JsonArray() {
//Given: array
JSONArray jsonArray = new JSONArray(Arrays.asList(new JSONObject(
new HashMap() {{
put("a", 100);
put("b", 200);
}}
),
new JSONObject(
new HashMap() {{
put("a", 300);
put("b", 400);
}}
)));
//Then: convert to List<JSONObject>
List<JSONObject> jsonItems = IntStream.range(0, jsonArray.length())
.mapToObj(index -> (JSONObject) jsonArray.get(index))
.collect(Collectors.toList());
// you can access the array elements now
jsonItems.forEach(arrayElement -> System.out.println(arrayElement.get("a")));
// prints 100, 300
}
Si l'itération n'est qu'une fois, (inutile de .collect
)
IntStream.range(0, jsonArray.length())
.mapToObj(index -> (JSONObject) jsonArray.get(index))
.forEach(item -> {
System.out.println(item);
});
En regardant votre code, je sens que vous utilisez JSONLIB. Si tel était le cas, regardez l'extrait suivant pour convertir le tableau json en tableau Java.
JSONArray jsonArray = (JSONArray) JSONSerializer.toJSON( input );
JsonConfig jsonConfig = new JsonConfig();
jsonConfig.setArrayMode( JsonConfig.MODE_OBJECT_ARRAY );
jsonConfig.setRootClass( Integer.TYPE );
int[] output = (int[]) JSONSerializer.toJava( jsonArray, jsonConfig );
Au cas où cela aiderait quelqu'un d'autre, j'ai pu convertir un tableau en faisant quelque chose comme ça,
JSONObject jsonObject = (JSONObject)new JSONParser().parse(jsonString);
((JSONArray) jsonObject).toArray()
... ou vous devriez pouvoir obtenir la longueur
((JSONArray) myJsonArray).toArray().length