关于@JsonProperty注解的使用

2年前 (2022) 程序员胖胖胖虎阿
307 0 0

关于@JsonProperty注解的使用

  • 1 @JsonProperty注解说明
  • 2 @JsonProperty注解使用
    • 1 用户实体类
    • 2 测试类
      • 1 序列化
      • 2 反序列化
  • 3 总结

在日常项目中,或因代码不规范,或因与第三方对接,或因特殊奇葩需求,导致同一个表达含义使用了不同的字段.此时,对于此类问题处理,如果仅仅使用硬编码方式, 代码不仅不够优雅美观,还可能导致后期维护的工作量多且容易出错.那么, 有没有更好地方法来解决问题呢?

1 @JsonProperty注解说明

@JsonProperty是jackson-databindjar包提供的注解,用于实体类的属性上, 功能是把属性名称转换为另一个名称(即,两个名称都指向同一个变量值)

@JsonProperty代码

@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonProperty
{
    /**
     * 默认值
     */
    public final static String USE_DEFAULT_NAME = "";

    /**
     * 默认序号
     */
    public final static int INDEX_UNKNOWN = -1;
    
    /**
     * 逻辑名称值
     */
    String value() default USE_DEFAULT_NAME;

    /**
     * 命令格式,可使用xml等
     */
    String namespace() default "";

    /**
     * 是否必须,默认否
     */
    boolean required() default false;

    /**
     * 序号
     */
    int index() default INDEX_UNKNOWN;

    /**
	 * 默认值
     */
    String defaultValue() default "";

    /**
     * 可选属性变量
     */
    Access access() default Access.AUTO;
    
    /**
     * 属性可选变量
     */
    public enum Access
    {
        /**
         * 自动
         */
        AUTO,

        /**
         * 只读模式,即序列化
         */
        READ_ONLY,

        /**
         * 只写模式,即反序列化
         */
        WRITE_ONLY,

        /**
         * 读写模式,即序列化和反序列化都可以
         */
        READ_WRITE
        ;
    }
}

2 @JsonProperty注解使用

通过打印实体类值,查看其序列化和反序列化时,注解的效果

1 用户实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {

    /**
     * 用户id
     */
    @JsonProperty(value = "user_id")
    private String userId;

    /**
     * 用户名称
     */
    @JsonProperty(value = "user_name")
    private String userName;

}

2 测试类

1 序列化

@JsonProperty注解是jackson提供的,必须要使用对应jar包提供的json转换工具才能得到注解上标识的属性值.

    @Test
    public void test1() throws JsonProcessingException {

        UserDTO userDTO = new UserDTO();
        userDTO.setUserId("0001");
        userDTO.setUserName("李白");

        // jackson提供的打印成json字符串
        System.out.println(new ObjectMapper().writeValueAsString(userDTO));
        System.out.println("===============================================");
        // fastjson提供的打印成json字符串
        System.out.println(JSON.toJSONString(userDTO));
    }

    /*
   	运行结果:
        {"user_id":"0001","user_name":"李白"}
        ====================================
        {"userId":"0001","userName":"李白"}
    */

2 反序列化

    @Test
    public void test2() throws IOException {

        // fastjson的反序列化 对于仅仅支持类属性或其驼峰命名属性
        String paramStr = "{\"userId\":\"0001\",\"userName\":\"李白\"}";
        String paramStr2 = "{\"user_id\":\"0001\",\"user_name\":\"李白\"}";
        System.out.println(JSON.parseObject(paramStr, UserDTO.class));
        System.out.println(JSON.parseObject(paramStr2, UserDTO.class));
        System.out.println("===============================================");

        // jackson 不支持此实体类原有属性的反序列化,因其只通过读取注解上值进行反序列化
        // 成功
        String paramStr3 = "{\"user_id\":\"0001\",\"user_name\":\"李白\"}";
        System.out.println(new ObjectMapper().readValue(paramStr3.getBytes(),UserDTO.class));
        // 失败 会报错 com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException
        String paramStr4 = "{\"userId\":\"0001\",\"userName\":\"李白\"}";

    }

3 总结

关于@JsonProperty注解, 主要是在序列化和反序列化过程中,对实体类属性做的映射,且必须要使用对应jackson包中的工具才可以得到@JsonProperty注解上指定的属性值.

版权声明:程序员胖胖胖虎阿 发表于 2022年9月16日 上午12:48。
转载请注明:关于@JsonProperty注解的使用 | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...