2015-10-02 48 views
-2

這是

baidu weather api如何使用GSON解析來自百度天氣API的JSON

URL中的JSON是

{ 
    "error": 0, 
    "status": "success", 
    "date": "2015-10-02", 
    "results": [ 
    { 
     "currentCity": "beijing", 
     "pm25": "81", 
     "index": [ 
     { 
      "title": "穿衣", 
      "zs": "舒適", 
      "tipt": "穿衣指數", 
      "des": "建議着長袖T恤、襯衫加單褲等服裝。年老體弱者宜着針織長袖襯衫、馬甲和長褲。" 
     }, 
     { 
      "title": "洗車", 
      "zs": "較適宜", 
      "tipt": "洗車指數", 
      "des": "較適宜洗車,未來一天無雨,風力較小,擦洗一新的汽車至少能保持一天。" 
     }, 
     { 
      "title": "旅遊", 
      "zs": "適宜", 
      "tipt": "旅遊指數", 
      "des": "天氣較好,溫度適宜,是個好天氣哦。這樣的天氣適宜旅遊,您可以盡情地享受大自然的風光。" 
     }, 
     { 
      "title": "感冒", 
      "zs": "少發", 
      "tipt": "感冒指數", 
      "des": "各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。" 
     }, 
     { 
      "title": "運動", 
      "zs": "較適宜", 
      "tipt": "運動指數", 
      "des": "天氣較好,戶外運動請注意防曬。推薦您進行室內運動。" 
     }, 
     { 
      "title": "紫外線強度", 
      "zs": "強", 
      "tipt": "紫外線強度指數", 
      "des": "紫外線輻射強,建議塗擦SPF20左右、PA++的防曬護膚品。避免在10點至14點暴露於日光下。" 
     } 
     ], 
     "weather_data": [ 
     { 
      "date": "週五 10月02日 (實時:18℃)", 
      "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/qing.png", 
      "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png", 
      "weather": "晴", 
      "wind": "微風", 
      "temperature": "26 ~ 12℃" 
     }, 
     { 
      "date": "週六", 
      "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/qing.png", 
      "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png", 
      "weather": "晴", 
      "wind": "微風", 
      "temperature": "25 ~ 12℃" 
     }, 
     { 
      "date": "週日", 
      "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/duoyun.png", 
      "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/duoyun.png", 
      "weather": "多雲", 
      "wind": "微風", 
      "temperature": "25 ~ 13℃" 
     }, 
     { 
      "date": "週一", 
      "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/qing.png", 
      "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png", 
      "weather": "晴", 
      "wind": "微風", 
      "temperature": "26 ~ 13℃" 
     } 
     ] 
    } 
    ] 
} 

我想用GSON解析它,但我遇到了一些問題。

在我WeatherInfo.java 我寫它像

public class WeatherInfo 
{ 
    private String error; 
    private String status; 
    private String date; 
    public String getError() {return error;} 
    public void setError(String error) {this.error = error;} 
    public String getStatus() {return status;} 
    public void setStatus(String status) {this.status = status;} 
    public String getDate(){return date;} 
    public void setDate(String date){this.date = date;} 
    public Results results; 
    public Results getResults(){return results;} 
    public void setResults(Results results){this.results = results;} 

    public static class Results 
    { 
     public String currentCity; 
     public String pm25; 
     public String getCurrentCity(){return currentCity;} 
     public void setCurrentCity(String currentCity){this.currentCity = currentCity;} 
     public String getPm25(){return pm25;} 
     public void setPm25(String pm25){this.pm25 = pm25;} 

     public Index getIndex() { 
      return index; 
     } 

     public void setIndex(Index index) { 
      this.index = index; 
     } 

     public Index index; 

     public Weather_data getWeather_data() { 
      return weather_data; 
     } 

     public void setWeather_data(Weather_data weather_data) { 
      this.weather_data = weather_data; 
     } 

     public Weather_data weather_data; 
     public static class Index 
     { 
      private String title; 
      private String zs; 
      private String des; 
      private String tipt; 

      public String getTitle(){return title;} 
      public void setTitle(String title){this.title = title;} 
      public String getZs(){return zs;} 
      public void setZs(String zs){this.zs = zs;} 
      public String getTipt() {return tipt;} 
      public void setTipt(String tipt) {this.tipt = tipt;} 
      public String getDes() {return des;} 
      public void setDes(String des) {this.des = des;} 

     } 
     public class Weather_data 
     { 
      private String data; 
      private String dayPictureUrl; 
      private String nightPictureUrl; 
      private String weather; 
      private String wind; 
      private String temperature; 

      public String getData() { 
       return data; 
      } 

      public void setData(String data) { 
       this.data = data; 
      } 

      public String getDayPictureUrl() { 
       return dayPictureUrl; 
      } 

      public void setDayPictureUrl(String dayPictureUrl) { 
       this.dayPictureUrl = dayPictureUrl; 
      } 

      public String getNightPictureUrl() { 
       return nightPictureUrl; 
      } 

      public void setNightPictureUrl(String nightPictureUrl) { 
       this.nightPictureUrl = nightPictureUrl; 
      } 

      public String getWeather() { 
       return weather; 
      } 

      public void setWeather(String weather) { 
       this.weather = weather; 
      } 

      public String getWind() { 
       return wind; 
      } 

      public void setWind(String wind) { 
       this.wind = wind; 
      } 

      public String getTemperature() { 
       return temperature; 
      } 

      public void setTemperature(String temperature) { 
       this.temperature = temperature; 
      } 



     } 

    } 

} 

我使用這個功能來解析JSON

public void parseJsonWithGson(String jsonData) { 
    Log.d(TAG,"用gson進行解析"); 
    Gson gson = new Gson(); 
    WeatherInfo weatherInfo = gson.fromJson(jsonData,WeatherInfo.class); 
    Log.d(TAG,"weatherInfo"+weatherInfo); 
    Log.d(TAG,"error is "+weatherInfo.getError()); 
    Log.d(TAG,"status is "+weatherInfo.getStatus()); 
    Log.d(TAG,"date is "+weatherInfo.getDate()); 
    Log.d(TAG,"currentcity is "+weatherInfo.getResults().getCurrentCity()); 
} 

最後有一個錯誤的

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 62 path $.results

+0

錯誤的含義正是它在消息中陳述的內容...... – Selvin

回答

0

result看起來像一個數組t Ø我,你GSON模式應該是:

public List<Results> results; 
public List<Results> getResults(){return results;} 

那麼當您分析

Log.d(TAG,"currentcity is "+weatherInfo.getResults().get(0).getCurrentCity()); 

無論如何,你不應該手工編寫這個模型中,有一些工具,可以幫助你生成POJO類。例如:

http://www.jsonschema2pojo.org/

我爲您生成的類:

import com.google.gson.annotations.Expose; 
import com.google.gson.annotations.SerializedName; 

import java.util.ArrayList; 
import java.util.List; 


public class WeatherInfo { 
    @SerializedName("error") 
    @Expose 
    private Integer error; 
    @SerializedName("status") 
    @Expose 
    private String status; 
    @SerializedName("date") 
    @Expose 
    private String date; 
    @SerializedName("results") 
    @Expose 
    private List<Result> results = new ArrayList<Result>(); 

    /** 
    * @return The error 
    */ 
    public Integer getError() { 
     return error; 
    } 

    /** 
    * @param error The error 
    */ 
    public void setError(Integer error) { 
     this.error = error; 
    } 

    /** 
    * @return The status 
    */ 
    public String getStatus() { 
     return status; 
    } 

    /** 
    * @param status The status 
    */ 
    public void setStatus(String status) { 
     this.status = status; 
    } 

    /** 
    * @return The date 
    */ 
    public String getDate() { 
     return date; 
    } 

    /** 
    * @param date The date 
    */ 
    public void setDate(String date) { 
     this.date = date; 
    } 

    /** 
    * @return The results 
    */ 
    public List<Result> getResults() { 
     return results; 
    } 

    /** 
    * @param results The results 
    */ 
    public void setResults(List<Result> results) { 
     this.results = results; 
    } 


    public class Index { 

     @SerializedName("title") 
     @Expose 
     private String title; 
     @SerializedName("zs") 
     @Expose 
     private String zs; 
     @SerializedName("tipt") 
     @Expose 
     private String tipt; 
     @SerializedName("des") 
     @Expose 
     private String des; 

     /** 
     * @return The title 
     */ 
     public String getTitle() { 
      return title; 
     } 

     /** 
     * @param title The title 
     */ 
     public void setTitle(String title) { 
      this.title = title; 
     } 

     /** 
     * @return The zs 
     */ 
     public String getZs() { 
      return zs; 
     } 

     /** 
     * @param zs The zs 
     */ 
     public void setZs(String zs) { 
      this.zs = zs; 
     } 

     /** 
     * @return The tipt 
     */ 
     public String getTipt() { 
      return tipt; 
     } 

     /** 
     * @param tipt The tipt 
     */ 
     public void setTipt(String tipt) { 
      this.tipt = tipt; 
     } 

     /** 
     * @return The des 
     */ 
     public String getDes() { 
      return des; 
     } 

     /** 
     * @param des The des 
     */ 
     public void setDes(String des) { 
      this.des = des; 
     } 

    } 


    public class Result { 

     @SerializedName("currentCity") 
     @Expose 
     private String currentCity; 
     @SerializedName("pm25") 
     @Expose 
     private String pm25; 
     @SerializedName("index") 
     @Expose 
     private List<Index> index = new ArrayList<Index>(); 
     @SerializedName("weather_data") 
     @Expose 
     private List<WeatherDatum> weatherData = new ArrayList<WeatherDatum>(); 

     /** 
     * @return The currentCity 
     */ 
     public String getCurrentCity() { 
      return currentCity; 
     } 

     /** 
     * @param currentCity The currentCity 
     */ 
     public void setCurrentCity(String currentCity) { 
      this.currentCity = currentCity; 
     } 

     /** 
     * @return The pm25 
     */ 
     public String getPm25() { 
      return pm25; 
     } 

     /** 
     * @param pm25 The pm25 
     */ 
     public void setPm25(String pm25) { 
      this.pm25 = pm25; 
     } 

     /** 
     * @return The index 
     */ 
     public List<Index> getIndex() { 
      return index; 
     } 

     /** 
     * @param index The index 
     */ 
     public void setIndex(List<Index> index) { 
      this.index = index; 
     } 

     /** 
     * @return The weatherData 
     */ 
     public List<WeatherDatum> getWeatherData() { 
      return weatherData; 
     } 

     /** 
     * @param weatherData The weather_data 
     */ 
     public void setWeatherData(List<WeatherDatum> weatherData) { 
      this.weatherData = weatherData; 
     } 


     public class WeatherDatum { 

      @SerializedName("date") 
      @Expose 
      private String date; 
      @SerializedName("dayPictureUrl") 
      @Expose 
      private String dayPictureUrl; 
      @SerializedName("nightPictureUrl") 
      @Expose 
      private String nightPictureUrl; 
      @SerializedName("weather") 
      @Expose 
      private String weather; 
      @SerializedName("wind") 
      @Expose 
      private String wind; 
      @SerializedName("temperature") 
      @Expose 
      private String temperature; 

      /** 
      * @return The date 
      */ 
      public String getDate() { 
       return date; 
      } 

      /** 
      * @param date The date 
      */ 
      public void setDate(String date) { 
       this.date = date; 
      } 

      /** 
      * @return The dayPictureUrl 
      */ 
      public String getDayPictureUrl() { 
       return dayPictureUrl; 
      } 

      /** 
      * @param dayPictureUrl The dayPictureUrl 
      */ 
      public void setDayPictureUrl(String dayPictureUrl) { 
       this.dayPictureUrl = dayPictureUrl; 
      } 

      /** 
      * @return The nightPictureUrl 
      */ 
      public String getNightPictureUrl() { 
       return nightPictureUrl; 
      } 

      /** 
      * @param nightPictureUrl The nightPictureUrl 
      */ 
      public void setNightPictureUrl(String nightPictureUrl) { 
       this.nightPictureUrl = nightPictureUrl; 
      } 

      /** 
      * @return The weather 
      */ 
      public String getWeather() { 
       return weather; 
      } 

      /** 
      * @param weather The weather 
      */ 
      public void setWeather(String weather) { 
       this.weather = weather; 
      } 

      /** 
      * @return The wind 
      */ 
      public String getWind() { 
       return wind; 
      } 

      /** 
      * @param wind The wind 
      */ 
      public void setWind(String wind) { 
       this.wind = wind; 
      } 

      /** 
      * @return The temperature 
      */ 
      public String getTemperature() { 
       return temperature; 
      } 

      /** 
      * @param temperature The temperature 
      */ 
      public void setTemperature(String temperature) { 
       this.temperature = temperature; 
      } 

     } 

    } 


} 

這裏是我的測試日誌

10-02 10:41:54.687 31361-31361/messagelogix.com.mysandbox D/MainActivity: 用gson進行解析 
10-02 10:41:54.820 31361-31361/package.com.mysandbox D/MainActivity: weatherInfo [email protected] 
10-02 10:41:54.820 31361-31361/package.com.mysandbox D/MainActivity: error is 0 
10-02 10:41:54.820 31361-31361/package.com.mysandbox D/MainActivity: status is success 
10-02 10:41:54.820 31361-31361/package.com.mysandbox D/MainActivity: date is 2015-10-02 
10-02 10:41:54.828 31361-31361/package.com.mysandbox D/MainActivity: currentcity is beijing 
+0

謝謝first.But json數據看起來像有對象和數組(包括一些對象和其他數組),當我改變我的代碼,如你writed,已錯誤'BEGIN_OBJECT但是BEGIN_ARRAY在第1行第103行路徑$ .results [0] .index'它不像我之前遇到的錯誤 – PPTing

+0

@PPTing看看我的編輯 – meda

+0

是的,它的工作原理。非常感謝你 – PPTing

0

在你的JSON,index映射一個jsonarray,不是一個JSONObject ,但是在你的Results類中,weather_data不是數組,因此存在Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 62 path $.results
要解決這個問題,只需將decalare weather_data添加到數組中並修改它的getter和setter。