关于@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注解上指定的属性值.
相关文章
暂无评论...