• 公用技术——数据格式——JSON——Jackson类库——序列化——JSON结构


      本篇介绍序列化后json字符串的几种结构。

    1、正常结构

    正常JavaBean指完全符合Java bean的规范,有空的构造器,每一个属性都有get和set方法。

    序列化的步骤如下,

    1. 创建Java bean的实例,为每一个属性赋值
    2. 创建ObjectMapper对象,它是将对象转换为JSON字符串的核心类。
    3. 调用ObjectMapper的writeValueAsString方法,参数是Java bean的实例。
    4. 校验,打印生成的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"
    }
  • 相关阅读:
    文字编码
    各个地区的编码
    Android中调用系统所装的软件打开文件
    Android中检测手机制式和移动网络类型
    Android使用ContentProvide(内容提供者)向其他应用程序共享数据
    windows Phone Push Notification
    解决Android加载图片时内存溢出的问题
    Android 正则表达式
    淡定
    Android简单数据存储类SharedPreferences详解及实例
  • 原文地址:https://www.cnblogs.com/rain144576/p/14565077.html
Copyright © 2020-2023  润新知