你真的会用Gson吗?Gson使用指南(一) 这篇帖子写得尤为详细
Gson 中文指南 (非官方)
https://github.com/google/gson/blob/master/UserGuide.md (官方)
public String toJson(Object src)
public String toJson(JsonElement jsonElement)
public <T> T fromJson(String json, Class<T> classOfT)
public <T> T fromJson(String json, Type typeOfT)
1. 基本用法
Gson是google开发的json格式解析包,其特点是在解析json之前必须知道所传输的json数据格式,并定义一系列层次结构与json层次结构相同的类。
{
"name":"relin",
"sex":"male",
"age":26
}
class Person {
public String name;
public String sex;
public int age;
}
- 如果预先定义的类中不包含json中的某个属性,则该属性就不会被解析出来,但是其他成员仍然能正常解析
- 命名必须完全相同,否则不会被正常解析
- 类的成员变量可以是public,也可以是private
a. json String to object
String str = "{\"name\":\"name0\",\"age\":0}";
Gson gson = new Gson();
Person person= gson.fromJson(str, Person.class);
b. object to json String
Gson gson = new Gson();
String str = gson.toJson(persons);
c. List、Map 与 json 的转化
List 转化为 json 会转为数组;
Map 转化为 json 就是一个包含若干映射的对象。
Gson gson=new Gson();
List<Person> rs=new ArrayList<Person>();
Type type = new TypeToken<ArrayList<Person>>() {}.getType();
rs=gson.fromJson(arrayJsonStr, type);
Map<String, Person> persons = gson.fromJson(mapJsonStr, new TypeToken<Map<String, Person>>() {}.getType());
2. @SerializedName 注解
@SerializedName 允许我们在 json 中使用与 java 类中对应成员变量不同的名字。
class Person {
@SerializedName("name")
public String mName = "";
public String sex;
public int age;
}
这样再使用Gson解析的时候就会将 name 对应的值赋值到 mName 属性上,同样的如果我们要使用 Gson 将 Person 生成 json 字符串的时候,也会将 mName 的名字生成 name 。这样就解决了java对象里属性名跟json里字段名不匹配的情况了。
当然,gson 中还有其他注解可以使用。JSON解析类库之Gson(3) --- Gson注解
3. 其他
new GsonBuilder().serializeNulls().disableHtmlEscaping().create();
new GsonBuilder().registerTypeAdapter(Id.class, new IdTypeAdapter())//自定义类型适配器
new GsonBuilder().enableComplexMapKeySerialization()//Map类型
new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE)//会把字段首字母大写
new GsonBuilder().setVersion(1.0)//自定义版本号