目前解析json最常用的三种工具:org.json(Java常用的解析),fastjson(阿里巴巴出的),Gson(Google出的),解析速度最快的是Gson。Gson的全名为Google-Json,能实现Java对象和JSON之间的相互转换。Gson的特点:
- 1)提供简单的toJson()方法和fromJson()去实现相互转换。
- 2)可以从JSON中转换出之前存在的不可改变的对象。
- 3)扩展提供了Java泛型。
- 4)支持任意复杂的对象。
JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象或者array数组, 也就是说可以存在嵌套的情况解析JSON数据前首先必须明确待解析的是JSON Object还是JSON array。Gson的jar包或库可以通过 https://github.com/google/gson 或 http://download.csdn.net/detail/zxyyxzzxy004/8206489 下载。
在不使用混淆工具进行apk打包时(比如直接Run As…),一切正常在使用混淆编译的方式进行apk打包时(比如Android Tools-->Export …),就不能获取到值了!如混淆前的数据为:[FamilyAssBean [id=dvip_7, name=钻石VIP7天, total=3, num=3, limitNum=1, users=[], getClass()=class com.lokinfo.m95xiu.bean.FamilyAssBean, hashCode()=211434389, toString()=com.lokinfo.m95xiu.bean.FamilyAssBean@c9a3b95]]混淆后的数据为:[FamilyAssBean [id=null, name=null, total=0, num=0, limitNum=0, users=null, getClass()=class com.lokinfo.m95xiu.c.r, hashCode()=11450174, toString()=com.lokinfo.m95xiu.c.r@aeb73e]]原因是:使用Gson的fromJson方法时,要求 Java Bean 中的字段名必须与服务端返回的 json 字符串中的 key 一致,才能进行解析,而混淆后, JavaBean 的类名与其字段名称全部变成了a、b、c、d等样式,这与服务端返回的 json 字符串中的 key 不一致,导致解析失败。所以,解决的办法是:在使用混淆编译方式进行apk打包的时候,过滤掉所有相关的 JavaBean 。在proguard.cfg文件中添加下面的代码:#Gson# Gson uses generic type information stored in a class file when working with fields. Proguard# removes such information by default, so configure it to keep all of it.-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }#-keep class com.google.gson.stream.** { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.examples.android.model.** { *; }#滤掉某个Java Bean 文件不进行混淆编译-keep class com.lokinfo.m95xiu.bean.FamilyAssBean {*;}#滤掉某个包下的所有.class文件不进行混淆编译-keep class com.lokinfo.m95xiu.bean.** {*;}
public class GsonTest {public static void main(String[] args) {objToJson();arrayToJson();listToJson();}/**json字符串和对象间的转换*/public static void objToJson() {Person student = new Person("包青天", "广州");Gson gson = new Gson();String json = gson.toJson(student);System.out.println("json字符串 = " + json);String jsonString = "{\"name\":\"包青天\",\"address\":\"广州\"}";Person student2 = gson.fromJson(jsonString, Person.class);System.out.println(student2.toString() + "\n");}/**json字符串和数组间的转换*/public static void arrayToJson() {String[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };Gson gson = new Gson();String daysJson = gson.toJson(days);System.out.println("Json字符串 = " + daysJson);String[] days2 = gson.fromJson(daysJson, String[].class);for (int i = 0; i < days2.length; i++) {System.out.print(days2[i] + " ");}System.out.println("\n");//******************************************************************************************int[][] data = { { 1, 2, 3 }, { 3, 4, 5 }, { 4, 5, 6 } };String json = gson.toJson(data);System.out.println("Json字符串 = " + json);int[][] data2 = gson.fromJson(json, int[][].class);for (int i = 0; i < data2.length; i++) {for (int j = 0; j < data2[i].length; j++) {System.out.print(data2[i][j] + " ");}System.out.println("");}System.out.println("");}/**json字符串和集合间的转换*/public static void listToJson() {Map<String, String> names = new HashMap<String, String>();names.put("Alice", "北京");names.put("Bob", "广州");names.put("Carol", "上海");Gson gson = new Gson();String jsonNames = gson.toJson(names);System.out.println("Json字符串 = " + jsonNames);Map<String, String> names2 = gson.fromJson(jsonNames, new TypeToken<Map<String, String>>() {}.getType());for (String key : names2.keySet()) {//增强for遍历健String value = names2.get(key);System.out.println(key + "---" + value);}System.out.println("");//******************************************************************************************List<Person> persons = new ArrayList<Person>();persons.add(new Person("Alice", "北京"));persons.add(new Person("Carol", "上海"));persons.add(new Person("Bob", "广州"));gson = new Gson();String jsonpPerson = gson.toJson(persons);System.out.println("Json字符串 = " + jsonpPerson);List<Person> person2 = gson.fromJson(jsonpPerson, new TypeToken<List<Person>>() {}.getType());for (Person student : person2) {System.out.println("student.getName() -- " + student.name);}}}
// json 节点解析。实际中我们不可能把全部父节点都封装成JavaBean,我们只需找到自己需要的那些节点的父节点,只将此父节点转换成object public class DemoParser {public static void main(String[] args) {String json = "{'flag':true,'data':{'name':'张三','age':18,'address':'广州'}}";JsonParser parser = new JsonParser();// 获得 根节点元素JsonElement element = parser.parse(json);//根据【接口文档】判断根节点属于什么类型的 Json节点对象(JsonObject或JsonArray)JsonObject root = element.getAsJsonObject();// 取得根节点下的某个节点的值JsonPrimitive flagJson = root.getAsJsonPrimitive("flag");boolean flag = flagJson.getAsBoolean();System.out.println(flag);JsonObject dataJson = root.getAsJsonObject("data");Person student = new Gson().fromJson(dataJson, Person.class);System.out.println(student);}}
public class Person {//不要求一定有get、set方法,也不要求一定有无参构造方法,甚至不要求其成员是public还是private//但要求所有字段名必须和json字符串中的一致public String name;public String address;public Person(String name, String address) {this.name = name;this.address = address;}@Overridepublic String toString() {return "name=" + name + " & " + "address=" + address;}}