2

で JSON ファイルを解析しようとしていましたJsonReader。関数を使用skipvalue()して次のキーに移動しますが、パーサーは次のキーに移動する代わりに、ファイルの最後にジャンプします。

ファイルは次のようになります。

{
   "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"
         }
      ]
   }
}

これは私のコードです:

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();
4

1 に答える 1

1

最初にjsonreaderを使用してjsonを解析する正しい方法だとは思いません.jsonは配列ではなくオブジェクトで始まります.これはjsonを解析する方法の例です.

主な機能

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();

データ読み取り機能

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();
}

それは、データオブジェクトにある天気オブジェクトの日付とtempMaxCを読みたい場合です。私の答えを理解していただければ幸いですが、質問がある場合はコメントでお気軽にお尋ねください:)

于 2013-03-20T17:00:26.143 に答える