天天看點

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,這個比較簡單。如果大家覺的有需要,我後面在寫。