Gson - 用于 Java 对象与 JSON 转换的 Java 序列化和反序列化库

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
    }

通过 GsonBuildersetDateFormat 方法设置日期处理方式,可以看到返回的 user1 的属性 major 是一个 ArrayList

JSON-java 和 Gson

JSON-java 和 Gson 都是 Java 处理 JSON 的类库。JSON-java 是 Android SDK 官方使用的库,在进行移动端开发,势必要运用这一类库。Gson 更适用于在服务端进行 JSON 的处理,Gson 的功能更加强大,比如对 Java 集合的处理和自定义属性的别名。