Gson解析JSON中動態未知字段key的方法


轉載自:Gson解析JSON中動態未知字段key的方法

原帖地址:http://blog.csdn.net/chaosminds/article/details/49049455

     前面一篇文章我介紹了Gson的解析的基本方法。但我們在享受Gson解析的高度封裝帶來的便利時,有時可能會遇到一些特殊情況,比如json數據中的字段key是動態可變的時候,由於Gson是使用靜態注解的方式來設置實體對象的,因此我們很難直接對返回的類型來判斷。但Gson在解析過程中如果不知道解析的字段,就會將所有變量存儲在一個Map中,我們只要實例化這個map就能動態地取出key和value了。

       先給出一段jsondata,這是天氣預報的數據,其中day_20151002這種key是隨日期而變化的,在實體類中就不能當做靜態變量來處理,我們就通過map來取出其映射對象。

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. "resultcode":"200","reason":"successed!",  
  2.     "result":{  
  3.             "sk":{  
  4.                  "temp":"24","wind_direction":"東北風","wind_strength":"2級","humidity":"28%","time":"17:38"  
  5.                   },  
  6.          "today":{  
  7.                  "temperature":"15℃~26℃","weather":"多雲轉晴","wind":"東北風微風","week":"星期日","city":"桂林","date_y":"2015年10月11日","dressing_index":"舒適","dressing_advice":"建議着長袖T恤、襯衫加單褲等服裝。年老體弱者宜着針織長袖襯衫、馬甲和長褲。","uv_index":"弱","comfort_index":"","wash_index":"較適宜","travel_index":"較適宜","exercise_index":"較適宜","drying_index":""  
  8.                  },  
  9.         "future":{  
  10.                  "day_20151011":{"temperature":"15℃~26℃","weather":"多雲轉晴","wind":"東北風微風","week":"星期日","date":"20151011"},  
  11.                  "day_20151012":{"temperature":"16℃~27℃","weather":"晴轉多雲","wind":"微風","week":"星期一","date":"20151012"},  
  12.                  "day_20151013":{"temperature":"16℃~26℃","weather":"多雲轉晴",,"wind":"微風","week":"星期二","date":"20151013"},  
  13.                  "day_20151014":{"temperature":"17℃~27℃","weather":"晴","wind":"北風微風","week":"星期三","date":"20151014"},  
  14.                  "day_20151015":{"temperature":"17℃~28℃","weather":"晴","wind":"北風微風","week":"星期四","date":"20151015"},  
  15.                  "day_20151016":{"temperature":"17℃~30℃","weather":"晴","wind":"北風微風","week":"星期五","date":"20151016"},  
  16.                  "day_20151017":{"temperature":"17℃~30℃","weather":"晴","wind":"北風微風","week":"星期六","date":"20151017"}  
  17.                  }  
  18.               },  
  19.     "error_code":0  
  20. }  

實體類中放上set、get和toString方法就太長了,這里就沒有加上去。

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class FutureDay {  
  2.     private String temperature;  
  3.     private String weather;  
  4.     private String wind;  
  5.     private String week;  
  6.     private String date;  
  7. }  
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class Result {  
  2.     private Sk sk;  
  3.     private Today today;  
  4.     private Map<String,FutureDay> future;  
  5. }  
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class Sk {  
  2.     private String temp;  
  3.     private String wind_direction;  
  4.     private String wind_strength;  
  5.     private String humidity;  
  6.     private String time;  
  7. }  
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class Today {  
  2.     private String temperature;  
  3.     private String weather;  
  4.     private String week;  
  5.     private String city;  
  6.     private String date_y;  
  7.     private String dressing_index;  
  8.     private String dressing_advice;  
  9.     private String uv_index;  
  10.     private String comfort_index;  
  11.     private String wash_index;  
  12.     private String travel_index;  
  13.     private String exercise_index;  
  14.     private String drying_index;  
  15. }  
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. public class Response {  
  2.     private String resultcode;  
  3.     private String reason;  
  4.     private String error_code;  
  5.     private Result result;  
  6. }  
[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. import java.io.BufferedReader;  
  2. import java.io.FileReader;  
  3. import java.util.Map;  
  4. import weather.*;  
  5. import com.google.gson.Gson;  
  6.   
  7.   
  8. public class GsonParseDynamicKey {  
  9.     public static  void main( String args []){  
  10.         String jsondata = readJsonFile();//從文件中讀取出json字符串,並打印出來  
  11.         Gson gson = new Gson();  
  12.         System.out.println("Start Gson parse jsondata");     
  13.         Response response = gson.fromJson(jsondata, Response.class);          
  14.         System.out.println(response.toString());  
  15.         System.out.println(response.getResult().getSk().toString());  
  16.         System.out.println(response.getResult().getToday().toString());  
  17.   
  18.         Map<String, FutureDay> future = response.getResult().getFuture(); //對動態的key,來創建map,間接從中取出實體類futrue。  
  19.         System.out.println("Keyset method");                     //這里取出value的方法有兩種keySet() entrySet().都給出了遍歷的方法  
  20.         for (String key:future.keySet()){                        //遍歷取出key,再遍歷map取出value。  
  21.             System.out.println("key:"+key);   
  22.             System.out.println(future.get(key).toString());  
  23.         }  
  24.   
  25.         System.out.println("Entryset method");  
  26.         for (Map.Entry<String,FutureDay> pair:future.entrySet()){//遍歷取出鍵值對,調用getkey(),getvalue()取出key和value。  
  27.              System.out.println("key:"+pair.getKey());  
  28.              System.out.println(pair.getValue().toString());  
  29.        }      
  30. }  
 

這里順便一提遍歷Map的兩種方法keySet(),entrySet()的差別。

keySet()方法返回的是key的集合set,entrySet()返回的是鍵值對的集合set。雖然兩者從set遍歷取出元素的方法是一樣的,但是根據這個元素取出value的效率有些不同。前者取出的元素是key,還要去原map中遍歷取出value。
后者取出的元素是鍵值對,直接調用getkey(),getvalue()方法就能快速取出key和value。顯然在map中存在大量鍵值對時,使用entrySet()來取出value的效率更高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM