Gson 是一个用于将 Java 对象 转换为 JSON 表示的 Java 库,当然也可以将一个 JSON 字符串 转换为一个 Java 对象。
生成 JSON
通过使用 Gson 对象来完成 JSON 生成和解析的工作,并可以使用 GsonBuilder 提供的功能对转换过程进行干预。下面是生成 JSON 的代码示例。
类 User 的定义,只列出属性部分:
@SerializedName("ID")
private Integer id;
private String name;
private String gender;
private Integer age;
private Date birthday;
private transient String school;
private String[] major;
private boolean Studying;
private Object position;
private String comment;
public static void main(String[] args) {
User user = new User();
user.setId(1001);
user.setName("Tom");
user.setGender("1");
user.setAge(25);
try {
user.setBirthday(new SimpleDateFormat("yyyy-mm-dd").parse("1990-10-29"));
} catch (ParseException e) {
e.printStackTrace();
}
user.setSchool("Harvard");
user.setMajor(new String[]{"Marh", "CS", "History"});
user.setStudying(true);
user.setPosition(null);
user.setComment("This is a comment");
GsonBuilder builder = new GsonBuilder();
//使打印输出更易读
builder.setPrettyPrinting();
//通过 FieldNamingStrategy 接口改变属性名称在 JSON 中的表示
//这里 name 属性在 JSON 中会被替换为 NAME
//也可以使用注解 @SerializedName("customPropertyName") 定义在相应实体类的属性上来实现
builder.setFieldNamingStrategy(new FieldNamingStrategy(){
@Override
public String translateName(Field f) {
if(f.getName().equals("name")){
return "NAME";
}
return f.getName();
}
});
//Gson gson = new Gson();
Gson gson = builder.create();
String gsonStr = gson.toJson(user);
System.out.println(gsonStr);
}
Gson 可以通过 FieldNamingStrategy 接口改变属性名称在 JSON 中的命名策略,以上代码生成的 JSON 字符串中会以 NAME 表示,而不是 name,也可以使用注解 @SerializedName("NAME") 定义在相应实体类的属性上来实现。
Gson 支持在实体类属性声明中使用关键字 transient 来忽略某些属性,例如下面的代码使得 school 不会加入 JSON 表示。
private transient String school;
可以看出转换为 JSON 过程也是一个对象序列化的过程,而在 Java 对象序列化中关键字 transient 修饰的属性会被忽略。
解析 JSON
Gson 可以很好的处理日期格式,以及将 JSON 中的数组与 Java 集合类进行无缝对接。
下面的代码中 User1 类的 major 属性改为 List<String>
public static void main(String[] args) throws IOException {
//gsonStr1在包com.ygl.gson下,所以路径不带"/";若资源在classpath下访问路径要带"/"
File file = new File(GsonParse1.class.getResource("gsonStr1").getFile());
String gsonStr = FileUtils.readFileToString(file, Charsets.toCharset("utf-8"));
GsonBuilder builder = new GsonBuilder();
builder.setDateFormat("yyyy-mm-dd");
Gson gson = builder.create();
User1 user1 = gson.fromJson(gsonStr, User1.class);
System.out.println(user1);
System.out.println(user1.getMajor().getClass().getName());//java.util.ArrayList
}
通过 GsonBuilder 的 setDateFormat 方法设置日期处理方式,可以看到返回的 user1 的属性 major 是一个 ArrayList。
JSON-java 和 Gson
JSON-java 和 Gson 都是 Java 处理 JSON 的类库。JSON-java 是 Android SDK 官方使用的库,在进行移动端开发,势必要运用这一类库。Gson 更适用于在服务端进行 JSON 的处理,Gson 的功能更加强大,比如对 Java 集合的处理和自定义属性的别名。