在web项目中遇到了@JsonAnySetter注解,代码类似如下
@Getter
@Setter
@ToString
public class User {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private String age;
private Map others;
@JsonAnyGetter
public MapanySetter() {
return others
}
@JsonAnySetter
public void anySetter(String key, Object value) {
if (others == null) {
others = new HashMap<>();
}
others .put(key, value);
}
}
@Controller
public class Controller {
@RequestMapping(value = "/test", method = RequestMethod.POST,
consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public String test(HttpServletRequest request, HttpServletResponse response, @RequestBody User user) {
// 业务处理
}
}
在model层的User对象我们定义了一个属性是Map类型,并且增加了@JsonAnySetter和@JsonAnyGetter注解,我们看一下在json序列化时map属性如何被序列化。
我们简单写一个json转java对象的小工具
public class JsonUtils {
private static final ObjectMapper mapper = new ObjectMapper();
public static String objToJson(T object) throws JsonProcessingException {
return mapper.writevalueAsString(object);
}
public static T jsonToObj(String json, Class clazz) {
try {
return mapper.readValue(json, clazz);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) throws JsonProcessingException {
User user = new User();
user.setName("numb");
user.setAge("26");
user.anySetter("skill", "java");
System.out.println(JsonUtils.objToJson(user));
String json = "{"name":"numb","age":"26","skill":"java"}";
User user1 = jsonToObj(json, User.class);
System.out.println(user1);
}
}
运行main函数可以发现在User序列化和反序列化时的输出:
{"others":{"skill":"java"},"name":"numb","age":"26","skill":"java"}
User(name=numb, age=26, others={skill=java})
可以发现当我们用json反序列化User对象时,
{
"name": "numb",
"age": "26",
"skill": "java"
}
name和age都是User的属性,而skill时“多余"的属性,但是通过@JsonAnySetter/@JsonAnyGetter注解被放入到private Map



