关于@JsonProperty注解的使用

您所在的位置:网站首页 json默认值 关于@JsonProperty注解的使用

关于@JsonProperty注解的使用

2023-10-05 06:00| 来源: 网络整理| 查看: 265

关于@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注解上指定的属性值.



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3