3

I was trying to parse a JSON file with JsonReader. I use the skipvalue() function to go to the next key, but instead of going to the next key, the parser jumps to the end of file.

The file looks like this:

{
   "data":{
      "current_condition":[
         {
            "cloudcover":"100",
            "humidity":"74",
            "observation_time":"01:28 PM",
            "precipMM":"0.4",
            "pressure":"1005",
            "temp_C":"-3",
            "temp_F":"27",
            "visibility":"6",
            "weatherCode":"326",
            "weatherDesc":[
               {
                  "value":"Light snow"
               }
            ],
            "weatherIconUrl":[
               {
                  "value":"http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0011_light_snow_showers.png"
               }
            ],
            "winddir16Point":"NE",
            "winddirDegree":"50",
            "windspeedKmph":"15",
            "windspeedMiles":"9"
         }
      ],
      "request":[
         {
            "query":"Minsk, Belarus",
            "type":"City"
         }
      ],
      "weather":[
         {
            "date":"2013-03-20",
            "precipMM":"4.4",
            "tempMaxC":"-4",
            "tempMaxF":"25",
            "tempMinC":"-13",
            "tempMinF":"10",
            "weatherCode":"326",
            "weatherDesc":[
               {
                  "value":"Light snow"
               }
            ],
            "weatherIconUrl":[
               {
                  "value":"http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0011_light_snow_showers.png"
               }
            ],
            "winddir16Point":"NE",
            "winddirDegree":"40",
            "winddirection":"NE",
            "windspeedKmph":"17",
            "windspeedMiles":"11"
         },
         {
            "date":"2013-03-21",
            "precipMM":"0.6",
            "tempMaxC":"-5",
            "tempMaxF":"23",
            "tempMinC":"-15",
            "tempMinF":"5",
            "weatherCode":"326",
            "weatherDesc":[
               {
                  "value":"Light snow"
               }
            ],
            "weatherIconUrl":[
               {
                  "value":"http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0011_light_snow_showers.png"
               }
            ],
            "winddir16Point":"NE",
            "winddirDegree":"38",
            "winddirection":"NE",
            "windspeedKmph":"12",
            "windspeedMiles":"7"
         },
         {
            "date":"2013-03-22",
            "precipMM":"0.1",
            "tempMaxC":"-9",
            "tempMaxF":"17",
            "tempMinC":"-19",
            "tempMinF":"-2",
            "weatherCode":"119",
            "weatherDesc":[
               {
                  "value":"Cloudy"
               }
            ],
            "weatherIconUrl":[
               {
                  "value":"http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0003_white_cloud.png"
               }
            ],
            "winddir16Point":"NE",
            "winddirDegree":"51",
            "winddirection":"NE",
            "windspeedKmph":"19",
            "windspeedMiles":"12"
         },
         {
            "date":"2013-03-23",
            "precipMM":"0.0",
            "tempMaxC":"-8",
            "tempMaxF":"18",
            "tempMinC":"-13",
            "tempMinF":"8",
            "weatherCode":"116",
            "weatherDesc":[
               {
                  "value":"Partly Cloudy"
               }
            ],
            "weatherIconUrl":[
               {
                  "value":"http:\/\/www.worldweatheronline.com\/images\/wsymbols01_png_64\/wsymbol_0002_sunny_intervals.png"
               }
            ],
            "winddir16Point":"NNE",
            "winddirDegree":"12",
            "winddirection":"NNE",
            "windspeedKmph":"16",
            "windspeedMiles":"10"
         }
      ]
   }
}

This is my code:

String json_url = "http://free.worldweatheronline.com/feed/weather.ashx?q="+city+"&format=json&num_of_days="+Integer.toString(days)+"&key=0592d3cc1b151105131103";
JsonReader forecastJsonReader = new JsonReader(new InputStreamReader(getUrlData(json_url)));
forecastJsonReader.beginArray();
while (forecastJsonReader.hasNext()) {
    String name = forecastJsonReader.nextName();
    if (name.equals("date")) {
        Log.d("WEATHER",forecastJsonReader.nextString());
    } else if(name.equals("tempMaxC")) {
        Log.d("WEATHER",forecastJsonReader.nextString());
    } else { 
        forecastJsonReader.skipValue();
    }

}
forecastJsonReader.endObject();
forecastJsonReader.close();
Michael Celey
  • 12,645
  • 6
  • 57
  • 62
user2013423
  • 31
  • 1
  • 2

1 Answers1

1

I don't think that's the right way to parse json using jsonreader first your json starts with an object not an array this is an example how you parse your json

main function

reader.beginObject();

        while (reader.hasNext()) {

            String name = reader.nextName();

            if (name.equals("data")) {
                readData(reader);
            } else {
                reader.skipValue(); // avoid some unhandle events
            }
        }

reader.endObject();
reader.close();

read data function

private void readData(JsonReader reader) throws IOException {
    reader.beginObject();
    while(reader.hasNext()) {
    String name = reader.nextName();
    if(name.equals("weather")) {
    reader.beginArray();
    while (reader.hasNext()) {
            reader.beginObject();
        String objectWeatherName = reader.nextName();
        if (objectWeatherName .equals("date")) {
             Log.d("WEATHER",reader.nextString());
        } else if (objectWeatherName .equals("tempMaxC")) {
             Log.d("WEATHER",reader.nextString());
        } else {
             reader.skipValue();
        }
            reader.endObject();
    }
    reader.endArray();
    } else {
        reader.skipValue();
    }

    }
    reader.endObject();
}

that's if you want to read date and tempMaxC in weather object that located in data object, I hope you understand my answer but if you have any question feel free to ask in the comment :)

Niko Adrianus Yuwono
  • 11,012
  • 8
  • 42
  • 64
  • thank you very match.Your code was very usefull,but programm crashed on the line if(name.equals("weather")) {reader.beginObject();.Иut that is another problem – user2013423 Mar 20 '13 at 17:38
  • the fact is that object "weather" contains array so at the first time we should to "reader.beginarray" and the "reader.beginobject".Thank you again. You've been very helpful – user2013423 Mar 20 '13 at 17:47
  • how to know how much objects is in array? – user2013423 Mar 20 '13 at 17:56
  • @user2013423 sorry I missed the [ bracket now I've edited my answer, to know how many objects in an array you can count how many looping in the while reader.hasnext after reader.beginArray() but you it'll be consumed, what actually do you want to do with the array length? – Niko Adrianus Yuwono Mar 21 '13 at 02:51