介绍一下是用Gson来解析json的方式。
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
直接上代码吧,代码里面有一些注释。参考了老罗的demo和lk_blog的博客。
还是那句话,json传递过来,在一些环境下是直接解析然后做其他处理,有的时候要转换到一个java对象。
先上java对象。我直接放到一个文件里面了。
1 package com.android.domain; 2 3 import java.util.Date; 4 5 public class Person { 6 7 private String name; 8 private int age; 9 private String address; 10 private Date birthDay; 11 12 public String getName() { 13 return name; 14 } 15 16 public Date getBirthDay() { 17 return birthDay; 18 } 19 20 public void setBirthDay(Date birthDay) { 21 this.birthDay = birthDay; 22 } 23 24 @Override 25 public String toString() { 26 return "Person [name=" + name + ", age=" + age + ", address=" + address 27 + ", birthDay=" + birthDay + "]"; 28 } 29 30 public void setName(String name) { 31 this.name = name; 32 } 33 34 public int getAge() { 35 return age; 36 } 37 38 public void setAge(int age) { 39 this.age = age; 40 } 41 42 public String getAddress() { 43 return address; 44 } 45 46 public void setAddress(String address) { 47 this.address = address; 48 } 49 50 public Person() { 51 // TODO Auto-generated constructor stub 52 } 53 54 } 55 56 57 package com.android.domain; 58 59 public class Point { 60 private int x; 61 private int y; 62 63 public Point(int x, int y) { 64 this.x = x; 65 this.y = y; 66 } 67 68 public int getX() { 69 return x; 70 } 71 72 public void setX(int x) { 73 this.x = x; 74 } 75 76 public int getY() { 77 return y; 78 } 79 80 public void setY(int y) { 81 this.y = y; 82 } 83 84 @Override 85 public String toString() { 86 return "Point [x=" + x + ", y=" + y + "]"; 87 } 88 89 } 90 91 package com.android.domain; 92 93 import java.util.Date; 94 95 import com.google.gson.annotations.Expose; 96 import com.google.gson.annotations.SerializedName; 97 98 public class Student { 99 private int id; 100 101 @Expose 102 private String name; 103 104 @Expose 105 @SerializedName("bir") 106 private Date birthDay; 107 108 public int getId() { 109 return id; 110 } 111 112 public void setId(int id) { 113 this.id = id; 114 } 115 116 public String getName() { 117 return name; 118 } 119 120 public void setName(String name) { 121 this.name = name; 122 } 123 124 public Date getBirthDay() { 125 return birthDay; 126 } 127 128 public void setBirthDay(Date birthDay) { 129 this.birthDay = birthDay; 130 } 131 132 @Override 133 public String toString() { 134 return "Student [birthDay=" + birthDay + ", id=" + id + ", name=" 135 + name + "]"; 136 } 137 138 }
接着就是执行类了。这里只是java的,跟android的差别不大。
1 package com.android.mygson; 2 3 import java.util.ArrayList; 4 import java.util.Date; 5 import java.util.HashMap; 6 import java.util.LinkedHashMap; 7 import java.util.List; 8 import java.util.Map; 9 10 import com.android.domain.Person; 11 import com.android.domain.Point; 12 import com.google.gson.Gson; 13 import com.google.gson.reflect.TypeToken; 14 15 public class GsonTools { 16 17 public GsonTools() { 18 // TODO Auto-generated constructor stub 19 } 20 21 public static String createGsonString(Object object) { 22 Gson gson = new Gson(); 23 String gsonString = gson.toJson(object); 24 return gsonString; 25 } 26 27 public static <T> T changeGsonToBean(String gsonString, Class<T> cls) { 28 Gson gson = new Gson(); 29 T t = gson.fromJson(gsonString, cls); 30 return t; 31 } 32 33 public static <T> List<T> changeGsonToList(String gsonString, Class<T> cls) { 34 Gson gson = new Gson(); 35 List<T> list_person = gson.fromJson(gsonString, 36 new TypeToken<List<T>>() { 37 }.getType()); 38 return list_person; 39 } 40 41 public static List<Map<String, Object>> changeGsonToListMaps(String gsonString) { 42 List<Map<String, Object>> list = null; 43 Gson gson = new Gson(); 44 list = gson.fromJson(gsonString, 45 new TypeToken<List<Map<String, Object>>>() { 46 }.getType()); 47 return list; 48 } 49 50 //这个方法太水了,因为json本来就是类似与map。。。 51 public static Map<String, Point> changeGsonToMap(String gsonString){ 52 Map <String,Point> map = null; 53 Gson gson= new Gson(); 54 map=gson.fromJson(gsonString, new TypeToken<Map<String,Object>>(){}.getType()); 55 return map; 56 57 } 58 /** 59 * @param args 60 */ 61 public static void main(String[] args) { 62 // TODO Auto-generated method stub 63 64 65 66 Person person1= new Person(); 67 person1.setAge(1); 68 person1.setName("xx"); 69 person1.setBirthDay(new Date()); 70 71 // ////////////////////////////////////////////////////////// 72 System.out.println("----------简单对象之间的转化-------------"); 73 // 简单的bean转为json 74 String s1 = createGsonString(person1); 75 System.out.println("简单Bean转化为Json===" + s1); 76 77 // json转为简单Bean 78 Person person = changeGsonToBean(s1, Person.class); 79 System.out.println("Json转为简单Bean===" + person); 80 81 82 Person person2= new Person(); 83 person2.setAge(2); 84 person2.setName("xue"); 85 person2.setBirthDay(new Date()); 86 Person person3= new Person(); 87 person3.setAge(3); 88 person3.setName("yuan"); 89 person3.setBirthDay(new Date()); 90 91 92 List<Person> list= new ArrayList<Person>(); 93 list.add(person1); 94 list.add(person2); 95 list.add(person3); 96 97 System.out.println("----------带泛型的List之间的转化-------------"); 98 // 带泛型的list转化为json 99 String s2 = createGsonString(list); 100 System.out.println("带泛型的list转化为json==" + s2); 101 102 List<Person> retList=changeGsonToList(s2, Person.class); 103 System.out.println("Json转为List===" + retList); 104 105 106 Map<String,Point > map_point = new LinkedHashMap<String,Point >();// 使用LinkedHashMap将结果按先进先出顺序排列 107 map_point.put( "first",new Point(5, 6)); 108 map_point.put( "second",new Point(8, 8)); 109 110 String s_map=createGsonString(map_point); 111 System.out.println("map转化为json==" + s_map); 112 113 Map<String,Point> map_point1 = changeGsonToMap(s_map); 114 System.out.println("json转化为map==" + s_map); 115 116 117 List<Map<String, Object>> list_map = new ArrayList<Map<String, Object>>(); 118 Map<String, Object> map = new HashMap<String, Object>(); 119 map.put("name", "jack"); 120 map.put("age", 23); 121 Map<String, Object> map2 = new HashMap<String, Object>(); 122 map2.put("name", "rose"); 123 map2.put("age", 24); 124 list_map.add(map); 125 list_map.add(map2); 126 String gsonString = createGsonString(list); 127 System.out.println(gsonString); 128 System.out.println("----------List嵌套map-------------"); 129 List<Map<String, Object>> list2 = changeGsonToListMaps(gsonString); 130 System.out.println(list2.toString()); 131 132 133 134 135 } 136 137 }
输出:
----------简单对象之间的转化-------------
简单Bean转化为Json==={"name":"xx","age":1,"birthDay":"Mar 27, 2014 6:31:09 PM"}
Json转为简单Bean===Person [name=xx, age=1, address=null, birthDay=Thu Mar 27 18:31:09 CST 2014]
----------带泛型的List之间的转化-------------
带泛型的list转化为json==[{"name":"xx","age":1,"birthDay":"Mar 27, 2014 6:31:09 PM"},{"name":"xue","age":2,"birthDay":"Mar 27, 2014 6:31:09 PM"},{"name":"yuan","age":3,"birthDay":"Mar 27, 2014 6:31:09 PM"}]
Json转为List===[{name=xx, age=1.0, birthDay=Mar 27, 2014 6:31:09 PM}, {name=xue, age=2.0, birthDay=Mar 27, 2014 6:31:09 PM}, {name=yuan, age=3.0, birthDay=Mar 27, 2014 6:31:09 PM}]
map转化为json=={"first":{"x":5,"y":6},"second":{"x":8,"y":8}}
json转化为map=={"first":{"x":5,"y":6},"second":{"x":8,"y":8}}
[{"name":"xx","age":1,"birthDay":"Mar 27, 2014 6:31:09 PM"},{"name":"xue","age":2,"birthDay":"Mar 27, 2014 6:31:09 PM"},{"name":"yuan","age":3,"birthDay":"Mar 27, 2014 6:31:09 PM"}]
----------List嵌套map-------------
[{name=xx, age=1.0, birthDay=Mar 27, 2014 6:31:09 PM}, {name=xue, age=2.0, birthDay=Mar 27, 2014 6:31:09 PM}, {name=yuan, age=3.0, birthDay=Mar 27, 2014 6:31:09 PM}]
1 package com.android.mygson; 2 import java.util.ArrayList; 3 import java.util.Date; 4 import java.util.List; 5 6 import com.android.domain.Student; 7 import com.google.gson.FieldNamingPolicy; 8 import com.google.gson.Gson; 9 import com.google.gson.GsonBuilder; 10 import com.google.gson.reflect.TypeToken; 11 12 public class GsonTest2 { 13 14 public static void main(String[] args) { 15 //注意这里的Gson的构建方式为GsonBuilder,区别于test1中的Gson gson = new Gson(); 16 Gson gson = new GsonBuilder() 17 .excludeFieldsWithoutExposeAnnotation() //不导出实体中没有用@Expose注解的属性 18 .enableComplexMapKeySerialization() //支持Map的key为复杂对象的形式 19 .serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss:SSS")//时间转化为特定格式 20 .setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效. 21 .setPrettyPrinting() //对json结果格式化. 22 .setVersion(1.0) //有的字段不是一开始就有的,会随着版本的升级添加进来,那么在进行序列化和返序列化的时候就会根据版本号来选择是否要序列化. 23 //@Since(版本号)能完美地实现这个功能.还的字段可能,随着版本的升级而删除,那么 24 //@Until(版本号)也能实现这个功能,GsonBuilder.setVersion(double)方法需要调用. 25 .create(); 26 27 28 29 Student student1 = new Student(); 30 student1.setId(1); 31 student1.setName("李坤"); 32 student1.setBirthDay(new Date()); 33 34 // ////////////////////////////////////////////////////////// 35 System.out.println("----------简单对象之间的转化-------------"); 36 // 简单的bean转为json 37 String s1 = gson.toJson(student1); 38 System.out.println("简单Bean转化为Json===" + s1); 39 40 // json转为简单Bean 41 Student student = gson.fromJson(s1, Student.class); 42 System.out.println("Json转为简单Bean===" + student); 43 // ////////////////////////////////////////////////////////// 44 45 Student student2 = new Student(); 46 student2.setId(2); 47 student2.setName("曹贵生"); 48 student2.setBirthDay(new Date()); 49 50 Student student3 = new Student(); 51 student3.setId(3); 52 student3.setName("柳波"); 53 student3.setBirthDay(new Date()); 54 55 List<Student> list = new ArrayList<Student>(); 56 list.add(student1); 57 list.add(student2); 58 list.add(student3); 59 60 System.out.println("----------带泛型的List之间的转化-------------"); 61 // 带泛型的list转化为json 62 String s2 = gson.toJson(list); 63 System.out.println("带泛型的list转化为json==" + s2); 64 65 // json转为带泛型的list 66 List<Student> retList = gson.fromJson(s2, 67 new TypeToken<List<Student>>() { 68 }.getType()); 69 for (Student stu : retList) { 70 System.out.println(stu); 71 } 72 73 } 74 }
输出:
----------简单对象之间的转化-------------
简单Bean转化为Json==={
"Name": "李坤",
"bir": "2014-03-27 18:32:20:301"
}
Json转为简单Bean===Student [birthDay=Thu Mar 27 18:32:20 CST 2014, id=0, name=李坤]
----------带泛型的List之间的转化-------------
带泛型的list转化为json==[
{
"Name": "李坤",
"bir": "2014-03-27 18:32:20:301"
},
{
"Name": "曹贵生",
"bir": "2014-03-27 18:32:20:343"
},
{
"Name": "柳波",
"bir": "2014-03-27 18:32:20:343"
}
]
Student [birthDay=Thu Mar 27 18:32:20 CST 2014, id=0, name=李坤]
Student [birthDay=Thu Mar 27 18:32:20 CST 2014, id=0, name=曹贵生]
Student [birthDay=Thu Mar 27 18:32:20 CST 2014, id=0, name=柳波]
1 package com.android.mygson; 2 3 import java.util.LinkedHashMap; 4 import java.util.Map; 5 6 import com.android.domain.Point; 7 import com.google.gson.Gson; 8 import com.google.gson.GsonBuilder; 9 import com.google.gson.reflect.TypeToken; 10 11 public class GsonTest3 { 12 13 public static void main(String[] args) { 14 Gson gson = new GsonBuilder().enableComplexMapKeySerialization() 15 .create(); 16 17 Map<Point, String> map1 = new LinkedHashMap<Point, String>();// 使用LinkedHashMap将结果按先进先出顺序排列 18 map1.put(new Point(5, 6), "first"); 19 map1.put(new Point(8, 8), "second"); 20 String s = gson.toJson(map1); 21 System.out.println(s); 22 23 Map<Point, String> retMap = gson.fromJson(s, 24 new TypeToken<Map<Point, String>>() { 25 }.getType()); 26 for (Point p : retMap.keySet()) { 27 System.out.println("key:" + p + " values:" + retMap.get(p)); 28 } 29 System.out.println(retMap); 30 31 System.out.println("----------------------------------"); 32 Map<String, Point> map2 = new LinkedHashMap<String, Point>(); 33 map2.put("first", new Point(3, 4)); 34 map2.put("second", new Point(5, 6)); 35 String s2 = gson.toJson(map2); 36 System.out.println(s2); 37 38 Map<String, Point> retMap2 = gson.fromJson(s2, 39 new TypeToken<Map<String, Point>>() { 40 }.getType()); 41 for (String key : retMap2.keySet()) { 42 System.out.println("key:" + key + " values:" + retMap2.get(key)); 43 } 44 45 } 46 }
输出:
[[{"x":5,"y":6},"first"],[{"x":8,"y":8},"second"]]
key:Point [x=5, y=6] values:first
key:Point [x=8, y=8] values:second
{Point [x=5, y=6]=first, Point [x=8, y=8]=second}
----------------------------------
{"first":{"x":3,"y":4},"second":{"x":5,"y":6}}
key:first values:Point [x=3, y=4]
key:second values:Point [x=5, y=6]