日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

jackson 序列化_jackson序列化与反序列化的应用实践

發(fā)布時(shí)間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jackson 序列化_jackson序列化与反序列化的应用实践 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者 | zhouweixin

來(lái)源 | urlify.cn/iEbiAz

66套java從入門到精通實(shí)戰(zhàn)課程分享

1 相關(guān)概念

  • 序列化: 把對(duì)象轉(zhuǎn)換為字節(jié)序列的過(guò)程稱為對(duì)象的序列化
  • 反序列化: 把字節(jié)序列恢復(fù)為對(duì)象的過(guò)程稱為對(duì)象的反序列化
  • 2 序列化的作用

  • 用于把內(nèi)存中的對(duì)象狀態(tài)保存到一個(gè)文件中或者數(shù)據(jù)庫(kù)中
  • 用于網(wǎng)絡(luò)傳送對(duì)象
  • 用于遠(yuǎn)程調(diào)用傳輸對(duì)象
  • 3 準(zhǔn)備序列化對(duì)象

    準(zhǔn)備了兩個(gè)類, 教師類和學(xué)生類, 其中一個(gè)學(xué)生只有一個(gè)教師
    這里省略了構(gòu)造方法和setter, getter方法

    Teacher.java

    public?class?Teacher?{????private?String?name;????private?Integer?age;}

    Student.java

    package?org.zwx;public?class?Student?{????private?String?name;????private?Integer?age;????private?Sex?sex;????private?String?fatherName;????private?Date?bornTime;????private?Teacher?teacher;}

    Sex.java

    public?enum?Sex?{????MALE("男"),?FEMALE("女");????private?String?name;????????Sex(String?name)?{????????this.name?=?name;????}????public?String?getName()?{????????return?name;????}}

    4 引入jackson依賴

    本示例是基于gradle的, 從maven中心倉(cāng)庫(kù)中選擇了2.11.2版本的jackson-databind

    compile?group:?'com.fasterxml.jackson.core',?name:?'jackson-databind',?version:?'2.11.2'

    5 序列化與格式化輸出

    5.1 流程

  • 首先需要有一個(gè)待序列化對(duì)象, 本例中的student對(duì)象
  • 創(chuàng)建一個(gè)對(duì)象映射器, jackson包下的ObjectMapper
  • 調(diào)用序列化函數(shù), 本例中的writeValueAsString, 將對(duì)象轉(zhuǎn)為字符串, 便于展示
  • 5.2 代碼

    public?void?testSerializable()?throws?IOException?{????Student?student1?=?new?Student("小明",?18,?Sex.MALE,?"王富貴",?new?Date(),?new?Teacher("李老師",?40));????Student?student2?=?new?Student("小花",?16,?Sex.FEMALE,?"錢很多",?new?Date(),?new?Teacher("趙老師",?38));????List?students?=?new?ArrayList<>();????students.add(student1);????students.add(student2);????ObjectMapper?mapper?=?new?ObjectMapper();????String?s?=?mapper.writerWithDefaultPrettyPrinter().writeValueAsString(students);????System.out.println(s);}

    5.3 結(jié)果

    [?{??"name"?:?"小明",??"age"?:?18,??"sex"?:?"MALE",??"fatherName"?:?"王富貴",??"bornTime"?:?1599996926917,??"teacher"?:?{????"name"?:?"李老師",????"age"?:?40??}},?{??"name"?:?"小花",??"age"?:?16,??"sex"?:?"FEMALE",??"fatherName"?:?"錢很多",??"bornTime"?:?1599996926917,??"teacher"?:?{????"name"?:?"趙老師",????"age"?:?38??}}?]

    5.4 分析

  • 示例中調(diào)用了方法writerWithDefaultPrettyPrinter, 美化了json的格式
  • 否則將打印
  • [{"name":"小明","age":18,"sex":"MALE","fatherName":"王富貴","bornTime":1599997061097,"teacher":{"name":"李老師","age":40}},{"name":"小花","age":16,"sex":"FEMALE","fatherName":"錢很多","bornTime":1599997061097,"teacher":{"name":"趙老師","age":38}}]
  • 6 自定義序列化的名字

    6.1 場(chǎng)景

    假如需要將序列化的json由駝峰命名修改為下劃線命名, 如fatherName修改為father_name

    只需要在字段fatherName上用注解JsonProperty配置

    6.2 示例代碼

    @JsonProperty("father_name")private?String?fatherName;@JsonProperty("born_time")private?Date?bornTime;

    6.3 示例結(jié)果

    [?{??"name"?:?"小明",??"age"?:?18,??"sex"?:?"MALE",??"teacher"?:?{????"name"?:?"李老師",????"age"?:?40??},??"father_name"?:?"王富貴",??"born_time"?:?1599997157609},?{??"name"?:?"小花",??"age"?:?16,??"sex"?:?"FEMALE",??"teacher"?:?{????"name"?:?"趙老師",????"age"?:?38??},??"father_name"?:?"錢很多",??"born_time"?:?1599997157610}?]

    7 自定義輸出格式

    7.1 bornTime格式設(shè)置

    當(dāng)前bornTime的格式為unix時(shí)間戮, 可讀性非常差

    現(xiàn)修改為yyyy-MM-dd HH:mm:ss
    并設(shè)置時(shí)區(qū)為東八區(qū)

    示例代碼

    @JsonProperty("born_time")@JsonFormat(pattern?=?"yyyy-MM-dd?HH:mm:ss",?timezone?=?"GMT+8")private?Date?bornTime;

    結(jié)果

    [?{??"name"?:?"小明",??"age"?:?18,??"sex"?:?"MALE",??"teacher"?:?{????"name"?:?"李老師",????"age"?:?40??},??"father_name"?:?"王富貴",??"born_time"?:?"2020-09-13?19:50:47"},?{??"name"?:?"小花",??"age"?:?16,??"sex"?:?"FEMALE",??"teacher"?:?{????"name"?:?"趙老師",????"age"?:?38??},??"father_name"?:?"錢很多",??"born_time"?:?"2020-09-13?19:50:47"}?]

    7.2 sex設(shè)置為中文

    只需要為Sex添加一個(gè)方法getOrdinal, 并添加注解JsonValue即可

    示例代碼

    @JsonValuepublic?String?getOrdinal()?{????return?name;}

    示例結(jié)果

    [?{??"name"?:?"小明",??"age"?:?18,??"sex"?:?"男",??"teacher"?:?{????"name"?:?"李老師",????"age"?:?40??},??"father_name"?:?"王富貴",??"born_time"?:?"2020-09-13?19:57:47"},?{??"name"?:?"小花",??"age"?:?16,??"sex"?:?"女",??"teacher"?:?{????"name"?:?"趙老師",????"age"?:?38??},??"father_name"?:?"錢很多",??"born_time"?:?"2020-09-13?19:57:47"}?]

    7.3 sex設(shè)置為序號(hào)

    有些場(chǎng)景喜歡用0和1等序號(hào)設(shè)置男女, 即枚舉的序號(hào): 0表示男, 1表示女

    此時(shí)需要修改Set的getOrdinal方法

  • 修改返回值類型為int
  • 調(diào)用父類的getOrdinal方法
  • 示例代碼

    @JsonValuepublic?int?getOrdinal()?{????return?super.ordinal();}

    示例結(jié)果

    [?{??"name"?:?"小明",??"age"?:?18,??"sex"?:?0,??"teacher"?:?{????"name"?:?"李老師",????"age"?:?40??},??"father_name"?:?"王富貴",??"born_time"?:?"2020-09-13?20:01:44"},?{??"name"?:?"小花",??"age"?:?16,??"sex"?:?1,??"teacher"?:?{????"name"?:?"趙老師",????"age"?:?38??},??"father_name"?:?"錢很多",??"born_time"?:?"2020-09-13?20:01:44"}?]

    8 拍平嵌套類型

    場(chǎng)景

    如前面提到的結(jié)果所示, teacher的兩個(gè)屬性并不在student的第一層,
    有時(shí)可能會(huì)更深的層次, 使用起來(lái)不太友好

    如何用teacher_name和teacher_age兩個(gè)屬性代替teacher呢?

  • 在Student的teacher屬性上添加注解JsonUnwrapped, 意為不包裹
  • 在Teacher的屬性上利用注解JsonProperty重命名
  • 示例代碼

    Student.java

    @JsonUnwrappedprivate?Teacher?teacher;

    Teacher.java

    @JsonProperty("teacher_name")private?String?name;@JsonProperty("teacher_age")private?Integer?age;

    示例結(jié)果

    [?{??"name"?:?"小明",??"age"?:?18,??"sex"?:?0,??"teacher_name"?:?"李老師",??"teacher_age"?:?40,??"father_name"?:?"王富貴",??"born_time"?:?"2020-09-13?20:21:53"},?{??"name"?:?"小花",??"age"?:?16,??"sex"?:?1,??"teacher_name"?:?"趙老師",??"teacher_age"?:?38,??"father_name"?:?"錢很多",??"born_time"?:?"2020-09-13?20:21:53"}?]

    9 自定義序列化器

    9.1 場(chǎng)景

    假如需要將年齡調(diào)整為理論學(xué)齡, 即將年齡減去7, 得到理論學(xué)齡, 如何操作呢?

  • 創(chuàng)建自定義年齡序列化器AgeSerializer, 繼承StdSerializer<>
  • 創(chuàng)建AgeSerializer的構(gòu)造方法
  • 重寫serialize函數(shù)
  • 利用注解修指定Student屬性age的序列化器AgeSerializer
  • 9.2 示例代碼

    AgeSerializer.java

    public?class?AgeSerializer?extends?StdSerializer?{????protected?AgeSerializer()?{????????super(Integer.class);????}????@Override????public?void?serialize(Integer?value,?JsonGenerator?gen,?SerializerProvider?provider)?throws?IOException?{????????gen.writeNumber(value?-?7);????}}

    Student.java

    @JsonSerialize(using?=?AgeSerializer.class)private?Integer?age;

    9.3 示例結(jié)果

    [?{??"name"?:?"小明",??"age"?:?11,??"sex"?:?0,??"teacher_name"?:?"李老師",??"teacher_age"?:?40,??"father_name"?:?"王富貴",??"born_time"?:?"2020-09-13?20:31:59"},?{??"name"?:?"小花",??"age"?:?9,??"sex"?:?1,??"teacher_name"?:?"趙老師",??"teacher_age"?:?38,??"father_name"?:?"錢很多",??"born_time"?:?"2020-09-13?20:31:59"}?]

    10 反序列化

    10.1 流程

  • 首先需要有序列化好的數(shù)據(jù), 可以是string, byte[], 文件二進(jìn)制等
  • 創(chuàng)建一個(gè)對(duì)象映射器, jackson包下的ObjectMapper
  • 調(diào)用反序列化函數(shù), 本例中的readValue, 將字符串轉(zhuǎn)為對(duì)象
  • 10.2 反序列化對(duì)象數(shù)據(jù)

    示例代碼

    public?void?testDeserializable()?throws?JsonProcessingException?{????String?s?=?"{"name":"小明","age":11,"sex":0,"teacher_name":"李老師","teacher_age":40,"father_name":"王富貴","born_time":"2020-09-13?20:46:10"}";????ObjectMapper?mapper?=?new?ObjectMapper();????Student?student?=?mapper.readValue(s,?Student.class);????System.out.println(student);}

    示例結(jié)果

    Student{name='小明',?age=11,?sex=MALE,?fatherName='王富貴',?bornTime=Sun?Sep?13?20:46:10?CST?2020,?teacher=Teacher{name='李老師',?age=40}}

    分析

  • 為了便于打印對(duì)象數(shù)據(jù), 重寫了Student和Teacher的toString方法
  • 從數(shù)據(jù)中可以看出, age的結(jié)果是錯(cuò)誤的, 原因在于之前自定義的序列化器將年齡減小了7, 10.4節(jié)將會(huì)通過(guò)自定義反序列化器來(lái)解決此問(wèn)題
  • 10.3 反序列化對(duì)象數(shù)組數(shù)據(jù)

    示例代碼

    public?void?testDeserializableStudents()?throws?JsonProcessingException?{????String?s?=?"[{"name":"小明","age":11,"sex":0,"teacher_name":"李老師","teacher_age":40,"father_name":"王富貴","born_time":"2020-09-13?20:51:31"},{"name":"小花","age":9,"sex":1,"teacher_name":"趙老師","teacher_age":38,"father_name":"錢很多","born_time":"2020-09-13?20:51:31"}]";????ObjectMapper?mapper?=?new?ObjectMapper();????Student[]?students?=?mapper.readValue(s,?Student[].class);????for?(Student?student?:?students)?{????????System.out.println(student);????}}

    示例結(jié)果

    Student{name='小明',?age=11,?sex=MALE,?fatherName='王富貴',?bornTime=Sun?Sep?13?20:51:31?CST?2020,?teacher=Teacher{name='李老師',?age=40}}Student{name='小花',?age=9,?sex=FEMALE,?fatherName='錢很多',?bornTime=Sun?Sep?13?20:51:31?CST?2020,?teacher=Teacher{name='趙老師',?age=38}}

    分析

  • readValue的第二個(gè)參數(shù)需要傳類型, 這里推薦用數(shù)組, 不推薦用List, 具體原因筆者目前也沒(méi)花時(shí)間去研究
  • 10.4 自定義反序列化器

    從10.2節(jié)及10.3的現(xiàn)象中可以看出來(lái), 僅僅自定義的序列化器會(huì)導(dǎo)致序列化的過(guò)程是正常的, 反序列化的過(guò)程仍然是默認(rèn)邏輯, 有時(shí)候會(huì)導(dǎo)致意想不到的結(jié)果

    遇到此場(chǎng)景, 可以考慮自定義反序列化器

  • 創(chuàng)建自定義反序列化器AgeDeserializer, 繼承StdDeserializer<>
  • 重寫deserialize方法
  • 在Student的age屬性上添加注解JsonDeserialize, 并指定反序列化器AgeDeserializer
  • 示例代碼

    AgeDeserializer.java

    public?class?AgeDeserializer?extends?JsonDeserializer?{????@Override????public?Integer?deserialize(JsonParser?p,?DeserializationContext?ctxt)?throws?IOException,?JsonProcessingException?{????????return?p.getIntValue()?+?7;????}}

    Student.java

    @JsonSerialize(using?=?AgeSerializer.class)@JsonDeserialize(using?=?AgeDeserializer.class)private?Integer?age;

    示例結(jié)果

    Student{name='小明',?age=18,?sex=MALE,?fatherName='王富貴',?bornTime=Sun?Sep?13?20:51:31?CST?2020,?teacher=Teacher{name='李老師',?age=40}}Student{name='小花',?age=16,?sex=FEMALE,?fatherName='錢很多',?bornTime=Sun?Sep?13?20:51:31?CST?2020,?teacher=Teacher{name='趙老師',?age=38}}

    11 注解JsonInclude

    該注解使用在實(shí)體類上, 格式@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)

    其中, Include有7種參數(shù), 功能對(duì)比如下

    參數(shù)功能備注Include.ALWAYS屬性總是序列化(需要有g(shù)et方法)默認(rèn)值Include.NON_DEFAULT屬性為默認(rèn)值不序列化如: int:0, bool:falseInclude.NON_EMPTY屬性為空("")或null不序列化
    Include.NON_NULL屬性為null不序列化
    Include.CUSTOM
    Include.USE_DEFAULTS
    Include.NON_ABSENT

    代碼示例

    Student.java

    @JsonInclude(value?=?JsonInclude.Include.NON_DEFAULT)public?class?Student?{public?void?testNonDefault()?throws?IOException?{????Student?student?=?new?Student("",?0,?null,?null,?null,?null);????ObjectMapper?mapper?=?new?ObjectMapper();????String?s?=?mapper.writeValueAsString(student);????System.out.println(s);}

    示例輸出

    {??"name"?:?"",??"age"?:?-7}

    分析

  • 當(dāng)屬性為默認(rèn)值, 即零值時(shí), 不序列化
  • 常見(jiàn)的零值:
  • int: 0
  • bool: false,
  • String: null
  • 12 注解JsonIgnoreProperties

    該注解為類注解, 配置忽略序列化和反序列化的字段名
    如下所示, 忽略字段name和age

    @JsonIgnoreProperties(value?=?{"name",?"age"})@JsonInclude(value?=?JsonInclude.Include.NON_DEFAULT)public?class?Student?{

    13 注解JsonIgnore

    該注解為屬性注解, 表示忽略當(dāng)前屬性, 如下所示, 表示忽略name字段

    @JsonIgnoreprivate?String?name;@JsonIgnoreprivate?String?name;

    總結(jié)

    以上是生活随笔為你收集整理的jackson 序列化_jackson序列化与反序列化的应用实践的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲玖玖玖 | av在线h| 欧美一区二区在线免费观看 | 国产3p露脸普通话对白 | 韩国av不卡 | 精品久久在线观看 | 99久久久无码国产精品 | www.国产.com| 性欧美另类 | 日韩精品免费在线观看 | 毛片麻豆| 懂色av中文一区二区三区天美 | 久色成人 | 日韩欧美视频一区二区三区 | 亚洲女人天堂网 | 亚洲av永久一区二区三区蜜桃 | va欧美 | 亚洲另类一区二区 | 成人区人妻精品一区二 | 先锋资源av网 | 日本理论中文字幕 | 亚洲24p| 国产传媒在线观看 | 午夜精品一区二区三区三上悠亚 | 谁有免费的黄色网址 | 一区二区三区在线免费视频 | 99热官网 | 亚洲加勒比在线 | 人妻熟女一区二区aⅴ水野 91在线观看视频 | 色偷偷综合网 | 日韩av电影手机在线观看 | 色综合久久久久综合体桃花网 | 成人性生交大片免费看vrv66 | 久久久久在线观看 | 不用播放器看av | 超碰99在线 | 尤物网址在线观看 | 影音先锋亚洲一区 | 免费黄色片子 | 日本黄色不卡 | 三级全黄做爰龚玥菲在线 | 亚洲精品一区二区三区婷婷月 | 国产视频一级 | 白白色免费视频 | 久久久性色精品国产免费观看 | 秋霞啪啪片 | 欧美色吊丝 | 韩国午夜影院 | 日本少妇一区二区 | 久久久久亚洲av成人网人人软件 | 日韩淫片 | 日韩精品一二三四 | www国产com | 久久爱影视| 桃色综合网 | 伊人成综合 | 亚洲欧美国产视频 | 进去里片欧美 | 呦呦视频在线观看 | 日本美女啪啪 | 国产精品一区三区 | av网站在线免费 | 亚洲激情视频在线 | 色五夜| 国产传媒视频在线 | 免费亚洲婷婷 | 亚洲午夜在线播放 | 青青草国产在线观看 | 不卡一区二区在线视频 | 欧美第二区 | 深夜网站在线观看 | 欧美特级黄色大片 | 成年人免费视频网站 | 中国老熟女重囗味hdxx | 97精品国产97久久久久久粉红 | 国产免费色视频 | 国产91在线视频观看 | 少妇裸体挤奶汁奶水视频 | 亚洲第8页 | 麻豆传媒在线免费 | 亚洲国产欧美一区 | 在线观看亚洲欧美 | 少妇第一次交换又紧又爽 | 国产美女91呻吟求 | 免费麻豆国产一区二区三区四区 | 亚洲欧洲日本一区二区三区 | 在线免费看黄色片 | 国产成a人亚洲精v品无码 | 欧美性生话 | 久久色av| 超碰人人草 | 激情 小说 亚洲 图片 伦 | 中文字幕在线播放一区 | 精品久久久久久一区二区里番 | 欧美男女视频 | 邻居少妇张开腿让我爽了在线观看 | 成人av小说 | 黄免费在线观看 | 久久综合第一页 |