GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。
GitHub链接 https://github.com/google/gson/
JSON有2种类型:
一种是对象object -> {key:value,key:value,...}
另一种是数组array -> [value,value,...]
一.对 json 数据进行反序列化,得到java 对象
- 简单的反序列化
String userJson = "{'sex':false,'name':'steve','number':'909','id':1}";
Gson gson=new Gson();
User user=gson.fromJson(userJson,User.class);
Log.d(TAG, "name-"+user.getName()+"_________number"+user.getNumber());
//name-steve_________number909
- 嵌套 Java Object 的反序列化
例如如下json字段
{
"age": 26,
"email": "578570174@qq.com",
"isDeveloper": true,
"name": "chenrenxiang",
"userAddress": {
"city": "Magdeburg",
"country": "Germany",
"houseNumber": "42A",
"street": "Main Street"
}
}
value
是数组时(hobbies),对应在java类中也是数组;value
是对象时,对应在java类中就是map
(k-v对)
- array的反序列化
String namesJson = "['xiaoqiang','chenrenxiang','hahaha']";
String []array=gson.fromJson(namesJson,String [].class);
- List的反序列化
对于List
,反序列化时必须提供它的Type
,通过Gson提供的TypeToken<T>.getType()
方法可以定义当前List
的Type
String userJson = "[{'isDeveloper':false,'name':'xiaoqiang','age':26,'email':'578570174@qq.com'},{'isDeveloper':true,'name':'xiaoqiang123','age':27,'email':'578570174@gmail.com'}]";
Gson gson = new Gson();
Type userListType = new TypeToken<ArrayList<User>>(){}.getType();
List<User> userList = gson.fromJson(userJson, userListType);
二.字段名不一致的问题
public class User {
private boolean isDeveloper;
@SerializedName("fullName")
private String name;
private int age;
private String email;
...
}
当json传入字段是fullname
时,反序列化后fullName的值会映射给name
三.限定某个字段不参加序列化或反序列化
@Expose(serialize=false,deserialize=false)
private String name;
上面的name
字段不参与序列化和反序列化
四.封装Gosn工具类
package com.example.mygson;
//gson工具类
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class GsonUtil {
/**
* 私有化构造方法
*/
private GsonUtil() {
}
/**
* 静态内部类做单例
*/
private static class SingletonHolder {
private static final Gson gson = new Gson();
}
/**
* 获取单例方法
* @return
*/
public static final Gson getInstance() {
return SingletonHolder.gson;
}
/**
* 将object对象转成json字符串
*
* @param object
* @return
*/
public static String GsonString(Object object) {
String gsonString = null;
if (getInstance() != null) {
gsonString = getInstance().toJson(object);
}
return gsonString;
}
/**
* 将GsonString转成泛型bean
*
* @param gsonString
* @param cls
* @return
*/
public static <T> T GsonToBean(String gsonString, Class<T> cls) {
T t = null;
if (getInstance() != null) {
t = getInstance().fromJson(gsonString, cls);
}
return t;
}
/**
* 转成list
* 解决泛型问题
* @param json
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> GsonToList(String json, Class<T> cls) {
List<T> list = new ArrayList<T>();
if (getInstance()!=null){
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for(final JsonElement elem : array){
list.add(getInstance().fromJson(elem, cls));
}
}
return list;
}
/**
* 转成list中有map的
*
* @param gsonString
* @return
*/
public static <T> List<Map<String, T>> GsonToListMaps(String gsonString) {
List<Map<String, T>> list = null;
if (getInstance() != null) {
list = getInstance().fromJson(gsonString,
new TypeToken<List<Map<String, T>>>() {
}.getType());
}
return list;
}
/**
* 转成map的
*
* @param gsonString
* @return
*/
public static <T> Map<String, T> GsonToMaps(String gsonString) {
Map<String, T> map = null;
if (getInstance() != null) {
map = getInstance().fromJson(gsonString, new TypeToken<Map<String, T>>() {
}.getType());
}
return map;
}
}