1、什么是Gson?
关于什么是Gson,谷歌给出了下面的解释:
Gson is a Java library that can be used to convert Java Objects into their JSON representation. It can also be used to convert a JSON string to an equivalent Java object. Gson is an open-source project hosted at http://code.google.com/p/google-gson.
翻译是:Gson是一个java类库可以将java对象转换成json表现出来。他也可以将json字符串转换成等同对性爱那个。Gson是一个开源工程,地址在 http://code.google.com/p/google-gson。
2、使用Gson的好处
1、Provide easy to use mechanisms like toString() and constructor (factory method) to convert Java to JSON and vice-versa
2、Allow pre-existing unmodifiable objects to be converted to and from JSON
3、Allow custom representations for objects
4、Support arbitrarily complex object
5、Generate compact and readability JSON output
翻译如下:
1、提供易于使用的机制,像toString()和构造器(工厂方法)去转换java对对象成json,反之亦然。
2、允许已经存在无法改变的对象去转换成json或者是将json转换成该对象
3、允许自定义表示对象
4、支持任意复杂的对象
5、生成JSON输出紧凑和可读性
3、使用Gson解析简单类型的数据
{"persons":{"age":10,"id":1,"name":"jack"}}
首先是定义一个Person类
public class Person implements Serializable {
private int id;
private String name;
private int age;
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public Person() {
}
使用Gson进行解析:要注意的是Gson是直接解析json数据中的内容体,所以我们需要将json数据的数组名给消除掉,可以直接用String中的方法截取子字符串。
String data = jsonString .substring(jsonString .indexOf(":") + 1, jsonString .lastIndexOf("}"));
使用泛型方法,可以方便转换成多种bean类型
/**
* @param <T> 传入的类型
* @param jsonString json字符串
* @param cls 传入的类型的.class
* @return
*/
public static <T> T getPerson(String jsonString, Class<T> cls) {
T t = null;
try {
Gson gson = new Gson();
t = gson.fromJson(jsonString, cls);
} catch (Exception e) {
// TODO: handle exception
}
return t;
}
//截取字符串的方法
public String subJsonString(String jsonString) {
jsonString = jsonString.substring(jsonString.indexOf(":") + 1,
jsonString.lastIndexOf("}"));
return jsonString;
}
调用也很简单,直接调用就可以了:
String jsonString = "{\"persons\":{\"age\":10,\"id\":1,\"name\":\"jack\"}}";
jsonString = subJsonString(jsonString);
Person person = getPerson(sTotalString, Person.class);
这样就解析完成了,一般我们获得的数据不一定是标准的json数据,需要我们自己进行字符串的裁剪。
解析包含多条数据的Json字符串
{"person":[{"age":14,"id":0,"name":"jack0"},{"age":14,"id":1,"name":"jack1"},{"age":5,"id":2,"name":"jack2"},{"age":4,"id":3,"name":"jack3"},{"age":18,"id":4,"name":"jack4"},{"age":6,"id":5,"name":"jack5"},{"age":19,"id":6,"name":"jack6"},{"age":18,"id":7,"name":"jack7"},{"age":9,"id":8,"name":"jack8"},{"age":25,"id":9,"name":"jack9"}]}
解析方式:
private static <T> List<T> getPersons(String jsonString, Class<T> cls){
List<T> list = new ArrayList<>();
Gson gson = new Gson();
//获取传入数据的类型,根据<List<T>>中的类型判断返回值类型
Type type = new TypeToken<List<T>>(){}.getType();
list = gson.fromJson(jsonString, type);
return list;
}
解析成Map集合的方式也十分的简单,只需要将类型换成Map
private static Map<String,Object> getPersonsToMap(String jsonString){
Map<String,Object> map = new HashMap<>();
Gson gson = new Gson();
//获取传入数据的类型,判断返回值类型
Type type = new TypeToken<Map<String,Object>>(){}.getType();
map = gson.fromJson(jsonString, type);
return map;
}
至于解析复杂的数据类型,只需要将他的Gson类型表示出来,使用上述的方法都可以解决!