简体   繁体   中英

I am not able to get the data from a Json array

Error message:  com.example.myjson W/System.err: org.json.JSONException: Value 
of type org.json.JSONObject cannot be converted to JSONArray 

JSON is as follows

{

"temp":296.88,

"feels_like":298.86,

"temp_min":296.88,

"temp_max":296.88,

"pressure":1013,

"humidity":89,

"sea_level":1013,

"grnd_level":986

}

I could get data from this alone

String weatherInfo = jsonObject.getString("weather");

Not from this string Why ?

JSONArray jsonArray1 = new JSONArray(weatherInfo1);
    @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
   
                try {

                    JSONObject jsonObject = new JSONObject(s);

                    String weatherInfo = jsonObject.getString("weather");

                    String weatherInfo1 = jsonObject.getString("main");

                    Log.i("weatherMainContent", weatherInfo1);

                    Log.i("Weather Details" , weatherInfo);


                    JSONArray jsonArray = new JSONArray(weatherInfo);

                    JSONArray jsonArray1 = new JSONArray(weatherInfo1);

                    Log.i("full " , jsonArray1.toString());

                    String message = "";

                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                        String main = jsonObject1.getString("main");
                        String description = jsonObject1.getString("description");
                        Log.i("Weather side Details" , weatherInfo);
                        Log.i("temperaturerrr", jsonObject1.getString("temp_min"));

                        String temp_min = jsonObject1.getString("temp_min");

                        Log.i("temperature", jsonObject1.getString("temp_min"));
                        String pressure = jsonObject1.getString("pressure");


                        if (!main.equals("") && !description.equals("") && !temp_min.equals("")) {

                            message += main + ":" + description +";" + temp_min + "\r\n";
                        } else {
                            Toast.makeText(getApplicationContext(), "couldn't find the giberish you mentioned :(", Toast.LENGTH_SHORT).show();

                        }
                    Log.i("Main", jsonObject1.getString("main"));
                    Log.i("Description", jsonObject1.getString("temp_min"));

                    }

                    if (!message.equals("")) {
                        resultTextView.setText(message);
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "couldn't find the giberish you mentioned :(", Toast.LENGTH_SHORT).show();

                }
            }

    }

Your Json is not an Array, but an Object.

Create a new JSONObject of your Json String. Then just use the object and use the getDouble("propertyName") method to get the value of the property:

    String json = "{\"temp\":296.88,\"feels_like\":298.86,\"temp_min\":296.88,\"temp_max\":296.88,\"pressure\":1013,\"humidity\":89,\"sea_level\":1013,\"grnd_level\":986}";

    JSONObject weatherInfo = new JSONObject(json);

    double temp = weatherInfo.getDouble("temp");
    double feels_like = weatherInfo.getDouble("feels_like");
    double temp_min = weatherInfo.getDouble("temp_min");
    double temp_max = weatherInfo.getDouble("temp_max");
    double pressure = weatherInfo.getDouble("pressure");
    double humidity = weatherInfo.getDouble("humidity");
    double sea_level = weatherInfo.getDouble("sea_level");
    double grnd_level = weatherInfo.getDouble("grnd_level");

    System.out.println(temp);
    System.out.println(feels_like);
    System.out.println(temp_min);
    System.out.println(temp_max);
    System.out.println(pressure);
    System.out.println(humidity);
    System.out.println(sea_level);
    System.out.println(grnd_level);

If this is your data "{"coord":{"lon":-0.13,"lat":51.51},"weather":[{"id":300,"main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],"base":"stations","main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},"visibility":10000,"wind":{"speed":4.1,"deg":80},"clouds":{"all":90},"dt":1485789600,"sys":{"type":1,"id":5091,"message":0.0103,"country":"GB","sunrise":1485762037,"sunset":1485794875},"id":2643743,"name":"London","cod":200} "

you have to just make some changes in the code to retrieve

        String jsonString = "your string";
        JSONObject json = new JSONObject(jsonString);
        JSONArray jsonArray = json.getJSONArray("weather");
        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject weatherObj = jsonArray.getJSONObject(i);
            System.out.println(weatherObj);
        }

        String baseValue = json.getString("base");
        Object mainValue = json.get("main");

        Object visibilityValue = json.get("visibility");
        Object windValue = json.get("wind");

@shivas To retrieve the below json { "main":"Drizzle","description":"light intensity drizzle","icon":"09d"}],"base":"stations","main":{"temp":280.32,"pressure":1012,"humidity":81,"temp_min":279.15,"temp_max":281.15},"visibility":10000,"wind":{"speed":4.1,"deg":80} from the source json, kindly check first which property is JSONArray and JSONObject.

Here is the code to retrieve it.

main , wind are JSONObject and weather is a JSONArray.

So assuming sourcejson is the entire JSONObject,

JSONObject main = sourcejson.optJSONObject("main");
System.out.println(main.toString());
JSONObject wind = sourcejson.optJSONObject("wind");
System.out.println(wind.toString());
JSONArray weather = sourcejson.optJSONArray("weather");
for (int i = 0; i < weather.length(); i++) {
            JSONObject weatherObj = weather.getJSONObject(i);
            System.out.println(weatherObj.toString());
        }
String base = sourcejson.optString("base");
int visibility = sourcejson.optInt("visibility");

Try this, you will get your data.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM