Gson解析JSON中动态未知字段key的方法
2015-10-11 17:06
786 查看
前面一篇文章我介绍了Gson的解析的基本方法。但我们在享受Gson解析的高度封装带来的便利时,有时可能会遇到一些特殊情况,比如json数据中的字段key是动态可变的时候,由于Gson是使用静态注解的方式来设置实体对象的,因此我们很难直接对返回的类型来判断。但Gson在解析过程中如果不知道解析的字段,就会将所有变量存储在一个Map中,我们只要实例化这个map就能动态地取出key和value了。
先给出一段jsondata,这是天气预报的数据,其中day_20151002这种key是随日期而变化的,在实体类中就不能当做静态变量来处理,我们就通过map来取出其映射对象。
实体类中放上set、get和toString方法就太长了,这里就没有加上去。
这里顺便一提遍历Map的两种方法keySet(),entrySet()的差别。
keySet()方法返回的是key的集合set,entrySet()返回的是键值对的集合set。虽然两者从set遍历取出元素的方法是一样的,但是根据这个元素取出value的效率有些不同。前者取出的元素是key,还要去原map中遍历取出value。
后者取出的元素是键值对,直接调用getkey(),getvalue()方法就能快速取出key和value。显然在map中存在大量键值对时,使用entrySet()来取出value的效率更高。
下面是最后打印出来的结果。
工程源码的下载地址点击打开链接
先给出一段jsondata,这是天气预报的数据,其中day_20151002这种key是随日期而变化的,在实体类中就不能当做静态变量来处理,我们就通过map来取出其映射对象。
{ "resultcode":"200","reason":"successed!", "result":{ "sk":{ "temp":"24","wind_direction":"东北风","wind_strength":"2级","humidity":"28%","time":"17:38" }, "today":{ "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":"" }, "future":{ "day_20151011":{"temperature":"15℃~26℃","weather":"多云转晴","wind":"东北风微风","week":"星期日","date":"20151011"}, "day_20151012":{"temperature":"16℃~27℃","weather":"晴转多云","wind":"微风","week":"星期一","date":"20151012"}, "day_20151013":{"temperature":"16℃~26℃","weather":"多云转晴",,"wind":"微风","week":"星期二","date":"20151013"}, "day_20151014":{"temperature":"17℃~27℃","weather":"晴","wind":"北风微风","week":"星期三","date":"20151014"}, "day_20151015":{"temperature":"17℃~28℃","weather":"晴","wind":"北风微风","week":"星期四","date":"20151015"}, "day_20151016":{"temperature":"17℃~30℃","weather":"晴","wind":"北风微风","week":"星期五","date":"20151016"}, "day_20151017":{"temperature":"17℃~30℃","weather":"晴","wind":"北风微风","week":"星期六","date":"20151017"} } }, "error_code":0 }
实体类中放上set、get和toString方法就太长了,这里就没有加上去。
public class FutureDay { private String temperature; private String weather; private String wind; private String week; private String date; }
public class Result { private Sk sk; private Today today; private Map<String,FutureDay> future; }
public class Sk { private String temp; private String wind_direction; private String wind_strength; private String humidity; private String time; }
public class Today { private String temperature; private String weather; private String week; private String city; private String date_y; private String dressing_index; private String dressing_advice; private String uv_index; private String comfort_index; private String wash_index; private String travel_index; private String exercise_index; private String drying_index; }
public class Response { private String resultcode; private String reason; private String error_code; private Result result; }
import java.io.BufferedReader; import java.io.FileReader; import java.util.Map; import weather.*; import com.google.gson.Gson; public class GsonParseDynamicKey { public static void main( String args []){ String jsondata = readJsonFile();//从文件中读取出json字符串,并打印出来 Gson gson = new Gson(); System.out.println("Start Gson parse jsondata"); Response response = gson.fromJson(jsondata, Response.class); System.out.println(response.toString()); System.out.println(response.getResult().getSk().toString()); System.out.println(response.getResult().getToday().toString()); Map<String, FutureDay> future = response.getResult().getFuture(); //对动态的key,来创建map,间接从中取出实体类futrue。 System.out.println("Keyset method"); //这里取出value的方法有两种keySet() entrySet().都给出了遍历的方法 for (String key:future.keySet()){ //遍历取出key,再遍历map取出value。 System.out.println("key:"+key); System.out.println(future.get(key).toString()); } System.out.println("Entryset method"); for (Map.Entry<String,FutureDay> pair:future.entrySet()){//遍历取出键值对,调用getkey(),getvalue()取出key和value。 System.out.println("key:"+pair.getKey()); System.out.println(pair.getValue().toString()); } }
这里顺便一提遍历Map的两种方法keySet(),entrySet()的差别。
keySet()方法返回的是key的集合set,entrySet()返回的是键值对的集合set。虽然两者从set遍历取出元素的方法是一样的,但是根据这个元素取出value的效率有些不同。前者取出的元素是key,还要去原map中遍历取出value。
后者取出的元素是键值对,直接调用getkey(),getvalue()方法就能快速取出key和value。显然在map中存在大量键值对时,使用entrySet()来取出value的效率更高。
下面是最后打印出来的结果。
工程源码的下载地址点击打开链接
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories