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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSON用于多态Java对象序列化

發(fā)布時間:2023/12/3 javascript 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSON用于多态Java对象序列化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
長期以來,JSON已成為客戶端和服務器之間各種數(shù)據(jù)序列化的事實上的標準。 除其他外,它的優(yōu)勢是簡單和易于閱讀。 但是,簡單起了一些限制,我今天要談的其中一個限制是:存儲和檢索多態(tài)Java對象。

讓我們從一個簡單的問題開始:過濾器的層次結構。 有一個抽象類AbstractFilter和兩個子類RegexFilterStringMatchFilter

package bean.json.examples;public abstract class AbstractFilter {public abstract void filter(); }

這是RegexFilter類:

package bean.json.examples;public class RegexFilter extends AbstractFilter {private String pattern;public RegexFilter( final String pattern ) {this.pattern = pattern;}public void setPattern( final String pattern ) {this.pattern = pattern;}public String getPattern() {return pattern;}@Overridepublic void filter() {// Do some work here} }

這是StringMatchFilter類:

package bean.json.examples;public class StringMatchFilter extends AbstractFilter {private String[] matches;private boolean caseInsensitive;public StringMatchFilter() {}public StringMatchFilter( final String[] matches, final boolean caseInsensitive ) {this.matches = matches;this.caseInsensitive = caseInsensitive;}public String[] getMatches() {return matches;}public void setCaseInsensitive( final boolean caseInsensitive ) {this.caseInsensitive = caseInsensitive;}public void setMatches( final String[] matches ) {this.matches = matches;}public boolean isCaseInsensitive() {return caseInsensitive;}@Overridepublic void filter() {// Do some work here} }

沒什么,純Java Bean。 現(xiàn)在,如果我們需要將AbstractFilter實例的列表存儲到JSON,更重要的是,要從JSON重新構造此列表,該怎么辦? 以下類Filters演示了我的意思:

package bean.json.examples;import java.util.ArrayList; import java.util.Arrays; import java.util.Collection;public class Filters {private Collection< AbstractFilter > filters = new ArrayList< AbstractFilter >();public Filters() {}public Filters( final AbstractFilter ... filters ) {this.filters.addAll( Arrays.asList( filters ) );}public Collection< AbstractFilter > getFilters() {return filters;}public void setFilters( final Collection< AbstractFilter > filters ) {this.filters = filters;} }

由于JSON是文本的,平臺無關的格式,因此它不包含任何類型特定的信息。 得益于出色的Jackson JSON處理器,它可以輕松完成。 因此,讓我們將Jackson JSON處理器添加到我們的POM文件中:

<project><modelversion>4.0.0</modelversion><groupid>bean.json</groupid><artifactid>examples</artifactid><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding></properties><dependencies><dependency><groupid>org.codehaus.jackson</groupid><artifactid>jackson-mapper-asl</artifactid><version>1.9.6</version></dependency></dependencies></project>

完成此步驟后,我們需要告訴Jackson ,我們打算將類型信息與對象一起存儲在JSON中,以便稍后可以從JSON重建確切的對象。 很少有AbstractFilter上的注釋可以做到這一點。

import org.codehaus.jackson.annotate.JsonSubTypes; import org.codehaus.jackson.annotate.JsonSubTypes.Type; import org.codehaus.jackson.annotate.JsonTypeInfo; import org.codehaus.jackson.annotate.JsonTypeInfo.Id;@JsonTypeInfo( use = Id.NAME ) @JsonSubTypes({@Type( name = "Regex", value = RegexFilter.class ),@Type( name = "StringMatch", value = StringMatchFilter.class )} ) public abstract class AbstractFilter {// ... }

而且...就是這樣! 跟隨幫助器類的工作是骯臟的工作,即將過濾器序列化為字符串,然后使用Jackson的 ObjectMapper從字符串反序列化它們:

package bean.json.examples;import java.io.IOException; import java.io.StringReader; import java.io.StringWriter;import org.codehaus.jackson.map.ObjectMapper;public class FilterSerializer {private final ObjectMapper mapper = new ObjectMapper();public String serialize( final Filters filters ) {final StringWriter writer = new StringWriter();try {mapper.writeValue( writer, filters );return writer.toString();} catch( final IOException ex ) {throw new RuntimeException( ex.getMessage(), ex );} finally {try { writer.close(); } catch ( final IOException ex ) { /* Nothing to do here */ }}}public Filters deserialize( final String str ) {final StringReader reader = new StringReader( str );try {return mapper.readValue( reader, Filters.class );} catch( final IOException ex ) {throw new RuntimeException( ex.getMessage(), ex );} finally {reader.close();}} }

讓我們看看實際情況。 以下代碼示例

final String json = new FilterSerializer().serialize(new Filters(new RegexFilter( "\\d+" ),new StringMatchFilter( new String[] { "String1", "String2" }, true )) );

產(chǎn)生以下JSON:

{ "filters":[{"@type":"Regex","pattern":"\\d+"},{"@type":"StringMatch","matches":["String1","String2"],"caseInsensitive":true}] }

如您所見, “ filters”集合中的每個條目都具有屬性“ @type” ,該屬性具有我們通過注釋AbstractFilter類指定的值。 調(diào)用new FilterSerializer()。deserialize(json)會生成完全相同的Filters對象實例。

參考:我們的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上提供了用于多態(tài)Java對象序列化的JSON 。


翻譯自: https://www.javacodegeeks.com/2012/05/json-for-polymorphic-java-object.html

總結

以上是生活随笔為你收集整理的JSON用于多态Java对象序列化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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