本篇介绍序列化后json字符串的几种结构。
1、正常结构
正常JavaBean指完全符合Java bean的规范,有空的构造器,每一个属性都有get和set方法。
序列化的步骤如下,
- 创建Java bean的实例,为每一个属性赋值
- 创建ObjectMapper对象,它是将对象转换为JSON字符串的核心类。
- 调用ObjectMapper的writeValueAsString方法,参数是Java bean的实例。
- 校验,打印生成的JSON字符串。
@SneakyThrows public static void user2json(){ // 创建User对象 User user = new User(); user.setId("007"); user.setName("James Bond"); user.setBirthDate(Calendar.getInstance().getTime()); user.setSex(Sex.MALE); user.setAge(30); // 创建ObjectMapper对象,序列化User对象 ObjectMapper om = new ObjectMapper(); // 设置缩进功能 om.enable(SerializationFeature.INDENT_OUTPUT); // 生成的json字符串 String jsonStr = om.writeValueAsString(user); System.out.println(jsonStr); }
它的结果为:
{ "id" : "007", "name" : "James Bond", "birthDate" : 1616381724722, "age" : 30, "sex" : "MALE" }
正常结构下,有以下映射关系
- 类---->Json对象,一对一。
- 属性--->json键,属性与键是一对一的,属性名与键名相同
- 属性值--->json键值,属性值与键值相同,无任何格式化。例如上述日期会转换为毫秒
- 顺序,类中定义的属性顺序即为Json字符串中出现的顺序。
2、空类
当类无任何属性时,序列化会抛错。解决错误的方式是启用SerializationFeature.FAIL_ON_EMPTY_BEANS功能。
注:启用某个功能调用ObjectMapper的enable方法,禁用为disable方法。
3、包裹结构
包裹结构是指属性外包一层,它会序列化为两个JSON对象,例如上述User对象的包裹结果:
{ "user" : { "id" : "007", "name" : "James Bond", "birthDate" : 1616382371664, "age" : 30, "sex" : "MALE" } }
外层的键”user”称为root name, 可以在User类上添加@JsonRootName设置。
@JsonRootName("user") public class User { // 属性 }
4、扁平结构
扁平结构是针对属性类型为自定义对象而言的,例如User下的Address属性,它的默认格式为
{user属性, “address“:{ // Address类中的属性} }
扁平结构是指去掉address键值,Address类中的属性与User类中的属性处于同一个JSON对象中,格式为:
{user属性, Address类中的属性 }
实现方式是在Address属性上添加@JsonUnWrapped注解,它的suffix,prefix用于区分Address,User属性。suffix表示后缀,prefix表示前缀。
示例如下:
@JsonUnwrapped(prefix = "address") private Address address;
5、单值
单值的含义是指对象会被序列化为单个值,它可以是属性值,也可以是方法的值。具体实现方式是在属性上或有返回值的方法上添加@JsonValue注解。例如在User的name属性上添加@JsonValue
// 名称 @JsonValue private String name;
它的效果如下:
// 有@JsonRootName, 键名称为注解的value属性值 { "user" : "James Bond" } // 无@JsonRootName,键名称为类名 { "User": "James Bond" }