天天看点

Jackson 通过自定义注解来控制json key的格式

最近我这边有一个需求就是需要把bean中的某一些特殊字段的值进行替换。而这个替换过程是需要依赖一个第三方的dubbo服务的。为了使得这个转换功能更加的通用,我们采用了下面的方式:

client端使用自定义的注解(假设为<code>@dimension</code>)标记bean中所有的「特殊字段」

client端把bean转换为json格式,但是这个转换过程的要求是:这些特殊的字段对应的json的key需要符合一定的格式,而这个格式依赖于标记的<code>@dimension</code>注解

然后client端通过dubbo rpc服务把json扔给server端,server进行一些json解析,替换之后把替换之后的json扔给client端,然后client端把接收到的json再转回为之前的bean对象的实例。

我们先来看看把bean转为json,一般没有特殊要求的话,我们都是:

这种是默认的情况,生成的json的key和对应的bean的filed的name是一模一样的。

而jackson也给我们提供了注解:<code>@jsonproperty</code>注解来帮助我们重命名生成的json的key。但是他这个重命名并不是很灵活,因为他只能固定的重命名为某一个「确定的」值,而不能容许我们做一些额外的操作。

所以在这种情况下,我打算自定义一个注解,因为业务场景相关,我们的注解定义如下:

假设我们的json的key的生成规则如下:

valuetype()的值为“id”时,json key追加后缀“_id”

valuetype()的值为"code"时,json key追加后缀“_code”

这个时候我们就可以使用jackson提供给我们强大的<code>jacksonannotationintrospector</code>类了。

同时为了触发上面的代码,以及为了验证我们的功能,我们有如下的代码:

运行之后输出结果为:

还算是很符合我们的期望的。

至于server端是如何替换json字符串的key的那块,简单的说一下,因为key有一定的格式,所以可以递归遍历json的所有key,就可以拿到有哪些key-value对需要处理了。关于如何在java中递归便利json,这个比较简单。如果大家觉的有需要,我后面在写。