探讨JSON数据的使用和解析以及Google的Gson框架的使用
- 理解JSON
- JSON是什么?
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式
- 本质就是具有特定格式的字符串
- JSON数据已经是客户端与服务器端交互的最常用的选择, 已经很少使用xml来进行数据交互了
2. JSON数据格式
- Json数组 : [ ] ,
Json数组的结构: [value1, value2, value3]
-
Json对象: { } ,
Json对象的结构: {key1:value1, key2:value2, key3:value3}
-
key的数据类型: 字符串 ------- value的数据类型: 数值 字符串 null json数组 [] json对象 {}
- JSON的解析
1.第一种方式就是利用安卓原生的api进行解析
有JSONObject和JSONArray两个类,分别对应JSON对象和JSON数组
下面是两个类的一些api方法:
------------- JsonObject : json对象 { }
JSONObject(String json) : 将json字符串解析为json对象
Xxx getXxx(String name) : 根据name, 在json对象中得到对应的Value
------------- JsonArray : json数组 []
JSONArray(String json) : 将json字符串解析为json数组
int length() : 得到json数组中元素的个数
Xxx getXxx(int index) : 根据下标得到json数组中对应的元素数据
2.第二种方式就是利用Google提供的Gson的框架,这个框架使用非常方便,只需一行代码就可以将json数据解析成一个javabean对象或者
将json数组数据解析成一个List集合。Gson框架不仅可以解析json数据,还可将List集合对象和javabean对象转换成一段json字符串数据。
Gson框架中有一个Gson类,这个类中有个重要的方法:
String toJson(Object src)
String toJson(Object src ,Type typeOfT) :将对象转换为对应格式的json字符串
T fromJson(String json, Type typeOfT)
T formJson(String json,Class<T> clazz): 解析Json字符串, 得到对象
下面就来探讨下Gson的使用:
1).首先将json格式的字符串{}转换为JavaBean对象
public void testJsonToObjectByGson() throws Exception { String jsonString = "{\"id\":2, \"name\":\"大虾\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"}"; ProdInfo info = new Gson().fromJson(jsonString, ProdInfo.class); System.out.println(info); }
可以看到,要将json格式的字符串{}转换为JavaBean对象,要调用Gson的T fromJson(String json, Class<T> clazz) 方法,第一个参数是json数据字符串,第二个参数是JavaBean的字节码对象
2).将json格式的字符串[]转换为JavaBean对象的List
public void testJsonToListByGson() throws Exception { String jsonString = "[{\"id\":3, \"name\":\"大虾\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"}," + "{\"id\":5, \"name\":\"大虾2\", \"price\":128.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f2.jpg\"}]"; List<ProdInfo> list = new ArrayList<ProdInfo>(); list=new Gson().fromJson(jsonString,new TypeToken<List<ProdInfo>>(){}.getType()); System.out.println(list); }
可以看到,要将json格式的字符串[]转换为Java对象的List,要调用Gson的T fromJson(String json, Type typeOfT) 方法,第一个参数是json数据字符串,第二个参数是List<JavaBean>的对应的Type对象
这里的难点就是这个Type对象如何获取,很幸运的是Gson已经封装好方法给我们去获取Type对象,就是通过TypeToken类来的getType()方法来获取,而因为TypeToken的构造方法是protected的,所以需要这样
来调用new TypeToken<List<ProdInfo>>(){}.getType()。看到这里有人可能会问为什么不用T fromJson(String json, Class<T> clazz) 这个方法,其实也可以,就是获取List<JavaBean>的字节码对象比较麻烦。
3).将JavaBean对象转换为json字符串{}
ProdInfo info=new ProdInfo(3,"大虾", 12.3, "http://192.168.10.165:8080/L05_Server/images/f1.jpg"); String jsonString=new Gson().toJson(info); System.out.println(jsonString);
4).将JavaBean对象的List转换为json字符串[]
ProdInfo info1=new ProdInfo(3,"大虾", 12.3, "http://192.168.10.165:8080/L05_Server/images/f1.jpg"); ProdInfo info2=new ProdInfo(4,"大虾", 12.4, "http://192.168.10.165:8080/L05_Server/images/f2.jpg"); List<ProdInfo> list=new ArrayList<ProdInfo>(); list.add(info1); list.add(info2);
//String jsonString=new Gson().toJson(list, new TypeToken<List<ProdInfo>>(){}.getType());
String jsonString=new Gson().toJson(list);
System.out.println(jsonString);
可以通过两个方法来转换,这里的Type对象的获取跟上面的一样这里就不多说了
作者表达能力有限,可能会误导你们,希望你们见谅。如果实在看不懂,可以通过测试代码调试来理解。。。。
浙公网安备 33010602011771号