激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 如何利用Jackson序列化忽略指定類型的屬性詳解

如何利用Jackson序列化忽略指定類型的屬性詳解

2021-06-09 14:00隔葉黃鶯 Java教程

這篇文章主要給大家介紹了關(guān)于如何利用Jackson序列化忽略指定類型的屬性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

本文準(zhǔn)確來(lái)講是探討如何用 jackson 來(lái)序列化 apache avro 對(duì)象,因?yàn)楹?jiǎn)單用 jackson 來(lái)序列化 apache avro 對(duì)象會(huì)報(bào)錯(cuò)。原因是序列化 schema getschema() 時(shí)會(huì)報(bào)錯(cuò),后面會(huì)講到,需要序列化時(shí)忽略屬性。那么能不能在 getschema() 上加上 @jsonignore 來(lái)忽略該屬性呢?原理上是通的。不過(guò)手工修改的 avsc 生成的 java 文件隨時(shí)會(huì)因?yàn)橹匦戮幾g而還原,所以不太具有實(shí)際可操作性,當(dāng)然通過(guò)定制編譯 avsc 用的模板文件來(lái)加入 @jsonignore 是另一回事。

由于不能在要忽略的字段上添加 jsonignore 來(lái)控制,而如果我們明確了要忽略的字段類型的話,是能夠定制 jackson 的  objectmapper  來(lái)屏蔽某個(gè)特定的類型。來(lái)看下面序列化 apache avro 對(duì)象的例子:

假設(shè)我們有一個(gè) apache 的 schema 文件 user.avsc, 內(nèi)容如下:

?
1
2
3
4
5
6
7
8
9
{
 "namespace": "cc.unmi.data",
 "type": "record",
 "name": "user",
 "fields": [
 {"name": "name", "type": "string"},
 {"name": "address", "type": ["string", "null"]}
 ]
}

編譯用 avro-tools compile schema user.avsc . 生成 cc.unmi.data.user.java 源文件,當(dāng)我們?cè)噲D對(duì)類型的對(duì)象用 jackson 進(jìn)行序列化時(shí)

?
1
2
3
objectmapper objectmapper = new objectmapper() ;
user user = user.newbuilder().setname("yanbin").setaddress("chicago").build();
system.out.println(objectmapper.writevalueasstring(user));

收到異常(關(guān)鍵信息)

caused by: org.apache.avro.avroruntimeexception: not a map: {"type":"record","name":"user","namespace":"cc.unmi.data","fields":[{"name":"name","type":"string"},{"name":"address","type":["string","null"]}]}
    at org.apache.avro.schema.getvaluetype(schema.java:294)
    at com.fasterxml.jackson.databind.ser.beanpropertywriter.serializeasfield(beanpropertywriter.java:664)
    at com.fasterxml.jackson.databind.ser.std.beanserializerbase.serializefields(beanserializerbase.java:689)

從上面的錯(cuò)誤可以定位到 jackson 的試圖序列化 user 對(duì)象的

?
1
public org.apache.avro.schema getschema() { return schema$; }

而 org.apache.avro.schema 中的 getvaluetype() 直接拋出異常拒絕被歸化

?
1
2
3
public schema getvaluetype() {
throw new avroruntimeexception("not a map: "+this);
}

因此,要實(shí)現(xiàn)序列化 apache avro 對(duì)象,解決的辦法有三

  • 凡是 org.apache.avro.schema 的屬性不被序列化(schema 輸出確實(shí)用處不大)
  • 或?qū)τ趏rg.apache.avro.schema 類型的屬性定制序列化,比如輸出為完整類名,或 schema 定義的文本內(nèi)容
  • 再來(lái)一個(gè),對(duì) specificrecordbase 類型的 schema 名稱的屬性進(jìn)行忽略(avro 類型繼承自 specificrecordbase)

它們的實(shí)現(xiàn)分別如下

忽略序列化指定類型的屬性

先定義一個(gè)標(biāo)注了 @jsonignoretype 的注解

?
1
2
3
@jsonignoretype
@interface ignoreavroschemafield {
}

序列化 apache avro 對(duì)象前給 objectmapp 加一個(gè) mixin

?
1
2
3
4
5
objectmapper objectmapper = new objectmapper() ;
objectmapper.addmixin(schema.class, ignoreavroschemafield.class);
 
user user = user.newbuilder().setname("yanbin").setaddress("chicago").build();
system.out.println(objectmapper.writevalueasstring(user));

有了上面高度行的代碼,這兒的 apache avro user 對(duì)象就能被正常序列化了,輸出為

{"name":"yanbin","address":"chicago"}

這樣 getschema() 返回的類型,或另何對(duì)象中有 org.apache.avro.schema 類型的屬性都會(huì)在序列化時(shí)忽略掉

定制 schema 屬的輸出內(nèi)容

對(duì)于 schema 類型的屬性,除了前面采取堵的方式,還可以因利疏導(dǎo),即定制 schema 屬性值的輸出內(nèi)容

定制化 schema 序列化方式

?
1
2
3
4
5
6
7
class avroschemaserializer extends jsonserializer<schema> {
 
 @override
 public void serialize(schema value, jsongenerator jgen, serializerprovider provider) throws ioexception {
 jgen.writestring(value.getfullname()); //直接輸出當(dāng)前 apache avro 對(duì)象的全限類名
 }
}

給 objectmapper 加上定制的序列化器

?
1
2
3
4
5
6
7
objectmapper objectmapper = new objectmapper() ;
simplemodule simplemodule = new simplemodule("simplemodule", version.unknownversion());
simplemodule.addserializer(schema.class, new avroschemaserializer());
objectmapper.registermodule(simplemodule);
 
user user = user.newbuilder().setname("yanbin").setaddress("chicago").build();
system.out.println(objectmapper.writevalueasstring(user));

序列化后產(chǎn)生的輸出如下

{"name":"yanbin","address":"chicago","schema":"cc.unmi.data.user"}

如果在 avroschemaserializer 把 jgen.writestring(value.getfullname()) 替換如下

?
1
jgen.writestring(value.tostring());

并且序列化后對(duì)內(nèi)容進(jìn)行格式化輸出

?
1
2
3
4
5
6
system.out.println(objectmapper.writerwithdefaultprettyprinter().writevalueasstring(user));
{
 "name" : "yanbin",
 "address" : "chicago",
 "schema" : "{\"type\":\"record\",\"name\":\"user\",\"namespace\":\"cc.unmi.data\",\"fields\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"address\",\"type\":[\"string\",\"null\"]}]}"
}

指定特定對(duì)象的屬性名進(jìn)行過(guò)濾

從語(yǔ)義上除了 ignore 外,filter 也像是干這事的,可以嘗試過(guò)下面的方式, 分兩步走

定義一個(gè)帶 @jsonfilter 的注解,也是不顯示注解到任何類

?
1
2
@jsonfilter("filter out apache avro schema field") //字符串值要與下面 addfilter("xxx") 保持一致
class propertyfiltermixin {}

給 objectmapper 設(shè)置 filter

?
1
2
3
4
5
6
7
8
objectmapper objectmapper = new objectmapper() ;
objectmapper.addmixin(specificrecordbase.class, propertyfiltermixin.class); //對(duì) specificrecordbase 類型的對(duì)象應(yīng)用
filterprovider filterprovider = new simplefilterprovider() //對(duì) specificrecordbase 類型(如 user) 的名為 "schema" 屬性屏蔽
 .addfilter("filter out apache avro schema field", simplebeanpropertyfilter.serializeallexcept("schema"));
objectmapper.setfilterprovider(filterprovider);
 
user user = user.newbuilder().setname("yanbin").setaddress("chicago").build();
system.out.println(objectmapper.writevalueasstring(user));

輸出效果沒(méi)有意外,也能避免序列化 schema 屬性

{"name":"yanbin","address":"chicago"}

這最后一種方式是本篇寫作行將結(jié)束時(shí)找到并驗(yàn)證的,所以不寫出來(lái),不進(jìn)行梳理可能永遠(yuǎn)只會(huì)第一種方法。

鏈接:

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:https://yanbin.blog/jackson-ignore-specified-field-type/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本网站一区二区三区 | 成人艳情一二三区 | 狠狠搞视频 | 成人免费在线视频播放 | 欧美一级黄色片免费观看 | 黄色午夜剧场 | 一本到免费视频 | 91福利在线观看 | 亚洲一区久久 | 久久精品国产一区二区 | 黄色网址免费入口 | 青青操国产 | 国产免费久久久久 | 国产成人综合在线观看 | 欧美毛片在线观看 | 欧美成人免费tv在线播放 | 久久精品79国产精品 | 久久99精品久久久久久国产越南 | 日本高清在线免费 | 亚洲影视在线观看 | 99r国产精品| 成人黄色小视频网站 | 激情黄页 | 亚洲成人在线免费 | 国产性tv国产精品 | 国产精品久久久久无码av | 日韩在线视频二区 | 免费黄色成人 | 久久吊| 日本视频在线播放 | 日本精品久久久一区二区三区 | 本色视频aaaaaa一级网站 | 国产精品视频免费在线观看 | 久久久久久久爱 | 国产婷婷一区二区三区 | 欧美亚成人 | 国产一区二区精彩视频 | 久久新地址 | 欧洲成人免费 | 国产九九热| 羞羞网站在线看 |