J'ai des problèmes pour accéder aux données dans une chaîne JSON. Qu'est-ce que je fais mal?

Travail:

JSONObject obj = new JSONObject("JSON-STRING");
JSONArray arr = obj.getJSONArray("weather");
System.out.println(arr.getJSONObject(0).get("description"); >> clear sky

Ca ne fonctionne pas:

JSONObject obj = new JSONObject("JSON-STRING");
JSONArray arr = obj.getJSONArray("main");
System.out.println(arr.getJSONObject(0).get("temp"); >> 285.15

Exception:

org.json.JSONException: JSONObject["main"] is not a JSONArray.
    at org.json.JSONObject.getJSONArray(JSONObject.java:622)
    at main.SmartHomeBot.onUpdateReceived(SmartHomeBot.java:47)
    at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:274)

La chaîne JSON:

{
    "coord": {
        "lon": 6.55,
        "lat": 51.27
    },
    "weather": [{
            "id": 800,
            "main": "Clear",
            "description": "clear sky",
            "icon": "01d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 285.15,
        "pressure": 1034,
        "humidity": 30,
        "temp_min": 285.15,
        "temp_max": 285.15
    },
    "visibility": 10000,
    "wind": {
        "speed": 2.6
    },
    "clouds": {
        "all": 0
    },
    "dt": 1492705200,
    "sys": {
        "type": 1,
        "id": 4909,
        "message": 0.2825,
        "country": "DE",
        "sunrise": 1492662386,
        "sunset": 1492713582
    },
    "id": 2808559,
    "name": "Willich",
    "cod": 200
}
2
piguy 20 avril 2017 à 20:57

3 réponses

Meilleure réponse

Vous obtenez l'erreur car weather est le tableau du multiple weather et main est l'objet unique.

La différence entre les deux est indiquée ci-dessous:

 "weather": [{
        "id": 800,
        "main": "Clear",
        "description": "clear sky",
        "icon": "01d"
    }
],

Et

"main": {
    "temp": 285.15,
    "pressure": 1034,
    "humidity": 30,
    "temp_min": 285.15,
    "temp_max": 285.15
},

Donc, dans le JSON "weather" : [{....}, {....}, {....}] [], montrez que weather est le tableau.

1
Peter Mortensen 20 avril 2017 à 21:32
String jsonobj = "{\n    \"coord\": {\n        \"lon\": 6.55,\n        \"lat\": 51.27\n    },\n    \"weather\": [{\n            \"id\": 800,\n            \"main\": \"Clear\",\n            \"description\": \"clear sky\",\n            \"icon\": \"01d\"\n        }\n    ],\n    \"base\": \"stations\",\n    \"main\": {\n        \"temp\": 285.15,\n        \"pressure\": 1034,\n        \"humidity\": 30,\n        \"temp_min\": 285.15,\n        \"temp_max\": 285.15\n    },\n    \"visibility\": 10000,\n    \"wind\": {\n        \"speed\": 2.6\n    },\n    \"clouds\": {\n        \"all\": 0\n    },\n    \"dt\": 1492705200,\n    \"sys\": {\n        \"type\": 1,\n        \"id\": 4909,\n        \"message\": 0.2825,\n        \"country\": \"DE\",\n        \"sunrise\": 1492662386,\n        \"sunset\": 1492713582\n    },\n    \"id\": 2808559,\n    \"name\": \"Willich\",\n    \"cod\": 200\n}";
JSONObject obj = new JSONObject(jsonobj);
JSONObject jsonObject = obj.getJSONObject("main");
System.out.println(jsonObject.get("temp"));
0
Peter Mortensen 20 avril 2017 à 21:34

Dans votre json parent, la valeur de la clé "weather" représente un JSONArray mais la valeur de la clé "main" représente un JSONObject et non un JSONArray.

Pour récupérer les données de JsonObject, vous devez faire comme ci-dessous

JSONObject mainObj = obj.getJSONObject("main");
System.out.println(mainObj.get("temp"));
0
Anil Agrawal 20 avril 2017 à 18:22