Gson

gson基本用法拓展

属性重命名

解析时对指定属性进行重命名为我们指定的命名

1
2
@SerializedName("email_address")
public String emailAddress;

多命名属性取值

解析时提供多个属性名进行选择,如果都出现取最后一个

1
2
@SerializedName(value = "emailAddress", alternate = {"email", "email_address"})
public String emailAddress;

解析数组

  1. 使用数组
1
2
3
Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
String[] strings = gson.fromJson(jsonArray, String[].class);
  1. 使用泛型
1
2
3
Gson gson = new Gson();
String jsonArray = "[\"Android\",\"Java\",\"PHP\"]";
List<String> stringList = gson.fromJson(jsonArray, new TypeToken<List<String>>() {}.getType());

使用泛型减少创建bean

  1. 固定数据,加bean
1
2
3
4
5
public class Result<T> {
public int code;
public String message;
public T data;
}
  1. 使用泛型,获取beanList<bean>
1
2
3
4
5
6
7
Type userType = new TypeToken<Result<User>>(){}.getType();
Result<User> userResult = gson.fromJson(json,userType);
User user = userResult.data;
Type userListType = new TypeToken<Result<List<User>>>(){}.getType();
Result<List<User>> userListResult = gson.fromJson(json,userListType);
List<User> users = userListResult.data;

手动解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String json = "{\"name\":\"怪盗kidou\",\"age\":\"24\"}";
User user = new User();
JsonReader reader = new JsonReader(new StringReader(json));
reader.beginObject(); // throws IOException
while (reader.hasNext()) {
String s = reader.nextName();
switch (s) {
case "name":
user.name = reader.nextString();
break;
case "age":
user.age = reader.nextInt(); //自动转换
break;
case "email":
user.email = reader.nextString();
break;
}
}
reader.endObject(); // throws IOException

手动格式化

1
2
3
4
5
6
7
8
JsonWriter writer = new JsonWriter(new OutputStreamWriter(System.out));
writer.beginObject() // throws IOException
.name("name").value("怪盗kidou")
.name("age").value(24)
.name("email").nullValue() //演示null
.endObject(); // throws IOException
writer.flush(); // throws IOException
//{"name":"怪盗kidou","age":24,"email":null}

自定义配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Gson gson = new GsonBuilder()
//序列化null,默认null也导出
.serializeNulls()
// 设置日期时间格式,另有2个重载方法
// 在序列化和反序化时均生效
.setDateFormat("yyyy-MM-dd")
// 禁此序列化内部类
.disableInnerClassSerialization()
//生成不可执行的Json(多了 )]}' 这4个字符)
.generateNonExecutableJson()
//禁止转义html标签
.disableHtmlEscaping()
//格式化输出
.setPrettyPrinting()
.create();