詳解jackson注解(二)jackson反系列化注解

詳解jackson注解(二)jackson反系列化注解

jackson中用于反系列化的主要注解有:

注解 描述
1 JsonCreator JsonCreator注解在構(gòu)造函數(shù)或者工廠方法上击孩,用于指示實例化類的對象甸鸟。構(gòu)造函數(shù)或者工廠方法有多個參數(shù)時璃谨,參數(shù)必須使用JsonProperty或JacksonInject注解攒发。只有一個參數(shù)時,可以不加盼砍。
2 JsonAlias @JsonAlias在反序列化時為屬性定義一個或多個別名
3 JsonSetter @JsonSetter是@JsonProperty的替代方法默辨。JsonSetter注解在某個方法上忘古,表明這個方法是setter方法
4 JsonAnySetter 反系列化時,@JsonAnySetter注解可以靈活地把類型為Map的屬性作為標(biāo)準(zhǔn)屬性使用疾渴。

一千贯、JsonCreator

JsonCreator注解在構(gòu)造函數(shù)或者工廠方法上,用于指示實例化類的對象搞坝。構(gòu)造函數(shù)或者工廠方法有多個參數(shù)時搔谴,參數(shù)必須使用JsonProperty或JacksonInject注解。只有一個參數(shù)時桩撮,可以不加敦第。

1峰弹、bean

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;

/**
 * @author chushiyan
 * @email  Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
 * @description
 */
public class Linkman implements Serializable {

    public int id;

    public String name;

    public Linkman() {
    }

    @JsonCreator
    // 構(gòu)造函數(shù)或者工廠方法有多個參數(shù)時,參數(shù)必須使用JsonProperty或JacksonInject注解芜果。
    public Linkman(@JsonProperty("linkman_name") String name, @JsonProperty("linkman_id") int id) {
        this.name = name;
        this.id = id;
    }

    @JsonCreator
    // 構(gòu)造函數(shù)或者工廠方法只有一個參數(shù)時鞠呈,可以不加JsonProperty或JacksonInject注解。
    public Linkman(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "Linkman{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

2右钾、測試

(1)測試多個參數(shù)的構(gòu)造函數(shù):

@Test
    public void testJsonCreate() throws JsonProcessingException {
        String json = "{\"linkman_id\":100,\"linkman_name\":\"chushiyan\"}";
        ObjectMapper mapper = new ObjectMapper();

        Linkman linkman = mapper
                .readerFor(Linkman.class)
                .readValue(json);
        System.out.println(linkman);
    }

控制臺打右狭摺:

Linkman{id=100, name='chushiyan'}

(2)測試只有單個參數(shù)的構(gòu)造函數(shù)

 @Test
    public void testJsonCreate2() throws JsonProcessingException {
        String json = "{\"linkman_name\":\"chushiyan\"}";
        ObjectMapper mapper = new ObjectMapper();

        Linkman linkman = mapper
                .readerFor(Linkman.class)
                .readValue(json);
        System.out.println(linkman);
    }

控制臺打印:

Linkman{id=0, name='chushiyan'}

二舀射、JsonAlias

@JsonAlias在反序列化時為屬性定義一個或多個別名窘茁。

1、bean

import com.fasterxml.jackson.annotation.JsonAlias;
import lombok.Data;

import java.io.Serializable;

/**
 * @author chushiyan
 * @email  Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
 * @description
 */
@Data
public class Customer implements Serializable {

    private String id;
    
    // 為name屬性定義兩個別名
    @JsonAlias({ "customer_name", "CustomerName" })
    private String name;
}

2后控、測試

    @Test
    public void testJsonAlias() throws JsonProcessingException {
        String json = "{\"id\":100,\"customer_name\":\"chushiyan\"}";
        ObjectMapper mapper = new ObjectMapper();
        Customer customer = mapper
                .readerFor(Customer.class)
                .readValue(json);
        System.out.println(customer);
    }

控制臺打用硎铩:

Customer(id=100, name=chushiyan)

三、JsonSetter

@JsonSetter是@JsonProperty的替代方法浩淘。JsonSetter注解在某個方法上捌朴,表明這個方法是setter方法

1、bean

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonSetter;

import java.io.Serializable;

/**
 * @author chushiyan
 * @email Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
 * @description
 */
public class Label implements Serializable {

    private String id;

    private String name;

    @JsonGetter("label_id")
    public String getId() {
        return id;
    }

    @JsonSetter("label_id")
    public void setId(String id) {
        this.id = id;
    }

    @JsonGetter("label_name")
    public String getName() {
        return name;
    }

    @JsonSetter("label_name")
    public void setName(String name) {
        this.name = name;
    }

    public Label() {
    }

    public Label(String id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public String toString() {
        return "Label{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
}

2张抄、測試

    @Test
    public void testJsonSetter() throws JsonProcessingException {
        Label label = new Label("100", "jackson");
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(label);
        System.out.println(json);
        
        Label label2 = mapper
                .readerFor(Label.class)
                .readValue(json);
        System.out.println(label2);
    }

控制臺打由氨巍:

{"label_id":"100","label_name":"jackson"}
Label{id='100', name='jackson'}

四、JsonAnySetter

反系列化時署惯,@JsonAnySetter注解可以靈活地把類型為Map的屬性作為標(biāo)準(zhǔn)屬性使用左驾。

1、bean

import com.fasterxml.jackson.annotation.JsonAnySetter;
import lombok.Data;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

/**
 * @author chushiyan
 * @email  Y2h1c2hpeWFuMDQxNUAxNjMuY29t(base64)
 * @description
 */
@Data
public class Book implements Serializable {

    private String id;

    @JsonAnySetter
    private Map<String, String> details = new HashMap<String, String>();
}

2极谊、測試

    @Test
    public void testJsonAnySetter() throws JsonProcessingException {
        String json = "{"
                + "\"id\" : \"100\","
                + "\"author\" : \"chushiyan\","
                + "\"price\" : \"30\","
                + "\"category\" : \"IT\""
                + "}";
        ObjectMapper mapper = new ObjectMapper();
        Book book = mapper.readValue(json, Book.class);
        System.out.println(book);
    }

控制臺輸出:

Book(id=100, details={author=chushiyan, price=30, category=IT})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诡右,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子轻猖,更是在濱河造成了極大的恐慌帆吻,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咙边,死亡現(xiàn)場離奇詭異猜煮,居然都是意外死亡,警方通過查閱死者的電腦和手機败许,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門王带,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人市殷,你說我怎么就攤上這事愕撰。” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵盟戏,是天一觀的道長绪妹。 經(jīng)常有香客問我,道長柿究,這世上最難降的妖魔是什么邮旷? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮蝇摸,結(jié)果婚禮上婶肩,老公的妹妹穿的比我還像新娘。我一直安慰自己貌夕,他們只是感情好律歼,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啡专,像睡著了一般险毁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上们童,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天畔况,我揣著相機與錄音,去河邊找鬼慧库。 笑死跷跪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的齐板。 我是一名探鬼主播吵瞻,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼甘磨!你這毒婦竟也來了橡羞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤济舆,失蹤者是張志新(化名)和其女友劉穎尉姨,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吗冤,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年九府,在試婚紗的時候發(fā)現(xiàn)自己被綠了椎瘟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡侄旬,死狀恐怖肺蔚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情儡羔,我是刑警寧澤宣羊,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布璧诵,位于F島的核電站,受9級特大地震影響仇冯,放射性物質(zhì)發(fā)生泄漏之宿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一苛坚、第九天 我趴在偏房一處隱蔽的房頂上張望比被。 院中可真熱鬧,春花似錦泼舱、人聲如沸等缀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽尺迂。三九已至,卻和暖如春冒掌,著一層夾襖步出監(jiān)牢的瞬間噪裕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工宋渔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留州疾,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓皇拣,卻偏偏與公主長得像严蓖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氧急,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容