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)@JacksonAnnotationpublic @interface JsonProperty{ public final static String USE_DEFAULT_NAME = ""; public final static int INDEX_UNKNOWN = -1; String value() default USE_DEFAULT_NAME; 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@NoArgsConstructorpublic class UserDTO { @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)); }
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注解上指定的属性值.