成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

仿造 Gson 的自制 json 解析器

tianren124 / 3065人閱讀

摘要:在測試當(dāng)中兼容性表現(xiàn)良好,但是執(zhí)行效率不如預(yù)期不及,筆者一度想要放棄該項(xiàng)目,但是造輪子不易,既然造了就稍微聊一聊吧,歡迎探討進(jìn)步。是一個(gè)中的接口,使用者可以自行實(shí)現(xiàn)該接口用以解析需要的類型,作用類似中的自定義的功能僅為預(yù)留,暫未做支持。

零 引子 0 源碼

已上傳 github

https://github.com/mikylin-pr...

1 開發(fā)依賴

Maven : 3.3.9 (主要用作打包工具)
IDE : idea 2018.3
JDK : OpenJDK 11.0.1 (OracleJDK 8 以上即可)

2 寫在前頭

Litjson 是筆者讀了 Gson 源碼之后的業(yè)余之作,基本思路仿造了 Gson,但是功能上做了不少精簡,僅僅能適用于比較標(biāo)準(zhǔn)的 json 字符串和 java 對(duì)象的互轉(zhuǎn)。

Litjson 在測試當(dāng)中兼容性表現(xiàn)良好,但是執(zhí)行效率不如預(yù)期(不及 Gson),筆者一度想要放棄該項(xiàng)目,但是造輪子不易,既然造了就稍微聊一聊吧,歡迎探討進(jìn)步。

一 自定義配置

Litjson 可以使用組件 OptionBox 進(jìn)行各種參數(shù)的修改,OptionBox 由其靜態(tài)內(nèi)部類 OptionBoxBuildr 創(chuàng)建:

//創(chuàng)建一個(gè) builder
OptionBox.OptionBoxBuilder boxBuilder = OptionBox.OptionBoxBuilder.builder();

//使用 builder 創(chuàng)建 OptionBox
OptionBox box = boxBuilder
        //在 json 字符串反序列化過程中要忽略的字符
        //默認(rèn)會(huì)忽略空字符串和換行符等字符類型
        .addIgnoreChar("c")
        //傳入一個(gè) List,批量設(shè)置忽略字符
        .addIgnoreChars(chars)
        //在 json 字符串反序列化過程中需要識(shí)別的日期格式,默認(rèn)僅有一種 yyyy-MM-dd HH:mm:ss
        .addReadDateFormat("yyyy-mm-dd")
        //傳入一個(gè) List,批量設(shè)置識(shí)別的日期格式
        .addReadDateFormats(dateformats)
        //TypeHandler 為類型轉(zhuǎn)換器
        //使用者可以自定義需要使用的類型轉(zhuǎn)換器,并以 map 的格式傳入
        //默認(rèn)只有 Integer/Long/String/Double/Float/Date 這幾種類型
        .addTypeHandlers(handlerMap)
        //在將 java bean 序列化的過程中使用單引號(hào)還是雙引號(hào)
        //true 為雙引號(hào),false 為單引號(hào),不設(shè)置的時(shí)候默認(rèn)為 true
        .isQoubleQuotationMarks(true)
        //在將 java bean 序列化的過程中需要轉(zhuǎn)的日期格式
        //默認(rèn)為 yyyy-MM-dd HH:mm:ss
        .writeDateFormat(dateformat)
        //創(chuàng)建 OptionBox
        .over();

OptionBox 的功能目前較少,后期補(bǔ)充。

TypeHandler 是一個(gè) Listjson 中的接口,使用者可以自行實(shí)現(xiàn)該接口用以解析需要的類型,作用類似 Gson 中的 TypeAdapter:

public interface TypeHandler {
    T read(String value);
    String write(T t);
}

?。?!自定義 TypeHandler 的功能僅為預(yù)留,暫未做支持。

二 反序列化

JReader 是 Litjson 中用于讀取 json 字符串(反序列化)的組件,提供多種構(gòu)造器進(jìn)行創(chuàng)建:

//配置盒
OptionBox box = OptionBox.OptionBoxBuilder.builder().over();
//JReader 的輔助工具類,使用配置盒進(jìn)行創(chuàng)建
ReadManager readManager = new ReadManager(box);

//第一個(gè)參數(shù)為 json 字符串
//第二個(gè)參數(shù)是需要讀成的 java class 類型
//第三個(gè)參數(shù)表示 是否為列表,true 代表是列表,false 代表是 object
//如果第三個(gè)參數(shù)為 true,則 classType 會(huì)表示成列表內(nèi)的泛型類型
//第四個(gè)參數(shù)是 readManager
JReader jReader = new JReader(jsonString,classType,true,readManager);
//只傳入 json 字符串,會(huì)輸出一個(gè) map,如果字符串本身是一個(gè)列表的話會(huì)報(bào)錯(cuò)
//不傳入 readManager,配置均使用默認(rèn)
JReader jReader1 = new JReader(jsonString);
//同上,只是會(huì)輸出成一個(gè) java class 類型
JReader jReader2 = new JReader(jsonString,classType);
//輸出成一個(gè)列表
JReader jReader3 = new JReader(jsonString,classType,true);

//輸出對(duì)象,參數(shù)設(shè)置必須為輸出非列表
Object o = jReader.toObj();
//輸出列表對(duì)象,參數(shù)設(shè)置必須為輸出列表
List list = jReader.toArray();
三 序列化

JWriter 是 Litjson 中用于輸出 json 字符串(序列化)的組件,提供多種構(gòu)造器進(jìn)行創(chuàng)建:

//配置盒
OptionBox box = OptionBox.OptionBoxBuilder.builder().over();
//JWriter 的輔助工具類,使用配置盒進(jìn)行創(chuàng)建
WriteManager writeManager = new WriteManager(box);

//第一個(gè)參數(shù)為要序列化的對(duì)象
//第二個(gè)參數(shù)是 writeManager
JWriter jWriter = new JWriter(object,writeManager);
//只傳入對(duì)象,不傳入 writeManager,配置均使用默認(rèn)
JWriter jWriter1 = new JWriter(object);

//輸出 json 字符串
String json = jWriter.toJson();
四 門面

介于一般情景下快速開發(fā)的需求,筆者參考了 Fastjson 的使用之后給 JReader 和 JWriter 整合了一個(gè)靜態(tài)門面類供使用者更加方便的調(diào)用:

//json 字符串的反序列化過程
Object obj = JSONBootstrap.read(jsonString);
//加入指定類型的反序列化
T obj = JSONBootstrap.read(jsonString,class);
//java bean 序列化過程
String json = JSONBootstrap.write(obj);
五 一點(diǎn)嘮叨
0 截止到 version 0.0.1,使用 IDEA 的 Statistic 插件統(tǒng)計(jì)共計(jì)約 2400 行 java 代碼

1 Litjson 的使用需要使用到 java bean 的無參構(gòu)造器和參數(shù)的 get/set 方法,沒有的話在反射創(chuàng)建階段就會(huì)報(bào)錯(cuò)

2 現(xiàn)階段支持的類型還很少,只能支持 java bean/Map/Collection/Integer/Long/Float/Double/String/Date

3 高并發(fā)下的 DateFormat 存在線程安全問題

4 筆者對(duì)項(xiàng)目整體性把握的功力還太淺,體現(xiàn)在對(duì)象封裝、錯(cuò)誤管理等各方面,有待后期完善

5 春節(jié)假期的自 high 作品,隨緣維護(hù),謹(jǐn)慎用于生產(chǎn)環(huán)境

6 造輪子使我快樂

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77413.html

相關(guān)文章

  • 追蹤解析Gson源碼(1)

    摘要:版本版本簡介是谷歌開源的解析工具。其實(shí)幾款產(chǎn)品的差別都很細(xì)微,有谷歌的信仰加成,所以在這里進(jìn)行一次源碼分析。至于和會(huì)在后續(xù)進(jìn)行追蹤。 零 前期準(zhǔn)備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 Gson 版本 : gson 2.8.5 IDE : idea 2018.3 2 Gson 簡介 Gson 是谷歌開源的 java json 解析工具。市場上同類的開源產(chǎn)品還有 F...

    sewerganger 評(píng)論0 收藏0
  • 追蹤解析Gson源碼(2)

    摘要:接上篇三和在進(jìn)行的序列化和反序列化源碼解析之前先了解一下其主體工具類。是中用于序列化的主體。同時(shí)為了兼顧性能做了很多有意思的設(shè)計(jì),比如獲取適配器的時(shí)候的雙緩存設(shè)計(jì),應(yīng)該是為了提高解析器的復(fù)用效率,具體有待研究。 接上篇 三 JsonReader 和 JsonWriter 在進(jìn)行 json 的序列化和反序列化源碼解析之前先了解一下其主體工具類。 1 JsonReader JsonRead...

    shiguibiao 評(píng)論0 收藏0
  • java解析和創(chuàng)建JSON

    摘要:概述即,是對(duì)象表示法的子集。具有以下特點(diǎn)數(shù)據(jù)放在鍵值對(duì)中數(shù)據(jù)由逗號(hào)分隔花括號(hào)表示對(duì)象方括號(hào)表示數(shù)組。創(chuàng)建一個(gè)對(duì)象為對(duì)象添加屬性創(chuàng)建數(shù)組將對(duì)象添加到數(shù)組將數(shù)組添加到對(duì)象將對(duì)象轉(zhuǎn)化成字符串參考文檔官網(wǎng) JSON概述 JSON即javascript object notation,是javascript對(duì)象表示法的子集。具有以下特點(diǎn): 數(shù)據(jù)放在鍵值對(duì)中; 數(shù)據(jù)由逗號(hào)分隔; 花括號(hào)表示對(duì)...

    鄒強(qiáng) 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<