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



