栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

@JsonAnySetter/@JsonAnyGetter在web开发中的作用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

@JsonAnySetter/@JsonAnyGetter在web开发中的作用

@JsonAnySetter

在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 others;。当我们用postman调用"/test"接口传入json时,skill同样会被放入Map中。所以我们可以得出:对于Model对象中不确定的参数(属性),可以使用@JsonAnySetter/@JsonAnyGetter注解统一放入到一个Map对象中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/354252.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号