摘要:在測試當中兼容性表現良好,但是執行效率不如預期不及,筆者一度想要放棄該項目,但是造輪子不易,既然造了就稍微聊一聊吧,歡迎探討進步。是一個中的接口,使用者可以自行實現該接口用以解析需要的類型,作用類似中的自定義的功能僅為預留,暫未做支持。
零 引子 0 源碼
已上傳 github
https://github.com/mikylin-pr...
1 開發依賴Maven : 3.3.9 (主要用作打包工具)
IDE : idea 2018.3
JDK : OpenJDK 11.0.1 (OracleJDK 8 以上即可)
Litjson 是筆者讀了 Gson 源碼之后的業余之作,基本思路仿造了 Gson,但是功能上做了不少精簡,僅僅能適用于比較標準的 json 字符串和 java 對象的互轉。
Litjson 在測試當中兼容性表現良好,但是執行效率不如預期(不及 Gson),筆者一度想要放棄該項目,但是造輪子不易,既然造了就稍微聊一聊吧,歡迎探討進步。
一 自定義配置Litjson 可以使用組件 OptionBox 進行各種參數的修改,OptionBox 由其靜態內部類 OptionBoxBuildr 創建:
//創建一個 builder OptionBox.OptionBoxBuilder boxBuilder = OptionBox.OptionBoxBuilder.builder(); //使用 builder 創建 OptionBox OptionBox box = boxBuilder //在 json 字符串反序列化過程中要忽略的字符 //默認會忽略空字符串和換行符等字符類型 .addIgnoreChar("c") //傳入一個 List,批量設置忽略字符 .addIgnoreChars(chars) //在 json 字符串反序列化過程中需要識別的日期格式,默認僅有一種 yyyy-MM-dd HH:mm:ss .addReadDateFormat("yyyy-mm-dd") //傳入一個 List ,批量設置識別的日期格式 .addReadDateFormats(dateformats) //TypeHandler 為類型轉換器 //使用者可以自定義需要使用的類型轉換器,并以 map 的格式傳入 //默認只有 Integer/Long/String/Double/Float/Date 這幾種類型 .addTypeHandlers(handlerMap) //在將 java bean 序列化的過程中使用單引號還是雙引號 //true 為雙引號,false 為單引號,不設置的時候默認為 true .isQoubleQuotationMarks(true) //在將 java bean 序列化的過程中需要轉的日期格式 //默認為 yyyy-MM-dd HH:mm:ss .writeDateFormat(dateformat) //創建 OptionBox .over();
OptionBox 的功能目前較少,后期補充。
TypeHandler 是一個 Listjson 中的接口,使用者可以自行實現該接口用以解析需要的類型,作用類似 Gson 中的 TypeAdapter:
public interface TypeHandler{ T read(String value); String write(T t); }
!!!自定義 TypeHandler 的功能僅為預留,暫未做支持。
二 反序列化JReader 是 Litjson 中用于讀取 json 字符串(反序列化)的組件,提供多種構造器進行創建:
//配置盒 OptionBox box = OptionBox.OptionBoxBuilder.builder().over(); //JReader 的輔助工具類,使用配置盒進行創建 ReadManager readManager = new ReadManager(box); //第一個參數為 json 字符串 //第二個參數是需要讀成的 java class 類型 //第三個參數表示 是否為列表,true 代表是列表,false 代表是 object //如果第三個參數為 true,則 classType 會表示成列表內的泛型類型 //第四個參數是 readManager JReader jReader = new JReader(jsonString,classType,true,readManager); //只傳入 json 字符串,會輸出一個 map,如果字符串本身是一個列表的話會報錯 //不傳入 readManager,配置均使用默認 JReader jReader1 = new JReader(jsonString); //同上,只是會輸出成一個 java class 類型 JReader jReader2 = new JReader(jsonString,classType); //輸出成一個列表 JReader jReader3 = new JReader(jsonString,classType,true); //輸出對象,參數設置必須為輸出非列表 Object o = jReader.toObj(); //輸出列表對象,參數設置必須為輸出列表 List list = jReader.toArray();三 序列化
JWriter 是 Litjson 中用于輸出 json 字符串(序列化)的組件,提供多種構造器進行創建:
//配置盒 OptionBox box = OptionBox.OptionBoxBuilder.builder().over(); //JWriter 的輔助工具類,使用配置盒進行創建 WriteManager writeManager = new WriteManager(box); //第一個參數為要序列化的對象 //第二個參數是 writeManager JWriter jWriter = new JWriter(object,writeManager); //只傳入對象,不傳入 writeManager,配置均使用默認 JWriter jWriter1 = new JWriter(object); //輸出 json 字符串 String json = jWriter.toJson();四 門面
介于一般情景下快速開發的需求,筆者參考了 Fastjson 的使用之后給 JReader 和 JWriter 整合了一個靜態門面類供使用者更加方便的調用:
//json 字符串的反序列化過程 Object obj = JSONBootstrap.read(jsonString); //加入指定類型的反序列化 T obj = JSONBootstrap.read(jsonString,class五 一點嘮叨); //java bean 序列化過程 String json = JSONBootstrap.write(obj);
0 截止到 version 0.0.1,使用 IDEA 的 Statistic 插件統計共計約 2400 行 java 代碼 1 Litjson 的使用需要使用到 java bean 的無參構造器和參數的 get/set 方法,沒有的話在反射創建階段就會報錯 2 現階段支持的類型還很少,只能支持 java bean/Map/Collection/Integer/Long/Float/Double/String/Date 3 高并發下的 DateFormat 存在線程安全問題 4 筆者對項目整體性把握的功力還太淺,體現在對象封裝、錯誤管理等各方面,有待后期完善 5 春節假期的自 high 作品,隨緣維護,謹慎用于生產環境 6 造輪子使我快樂
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77413.html
摘要:版本版本簡介是谷歌開源的解析工具。其實幾款產品的差別都很細微,有谷歌的信仰加成,所以在這里進行一次源碼分析。至于和會在后續進行追蹤。 零 前期準備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 Gson 版本 : gson 2.8.5 IDE : idea 2018.3 2 Gson 簡介 Gson 是谷歌開源的 java json 解析工具。市場上同類的開源產品還有 F...
摘要:接上篇三和在進行的序列化和反序列化源碼解析之前先了解一下其主體工具類。是中用于序列化的主體。同時為了兼顧性能做了很多有意思的設計,比如獲取適配器的時候的雙緩存設計,應該是為了提高解析器的復用效率,具體有待研究。 接上篇 三 JsonReader 和 JsonWriter 在進行 json 的序列化和反序列化源碼解析之前先了解一下其主體工具類。 1 JsonReader JsonRead...
摘要:概述即,是對象表示法的子集。具有以下特點數據放在鍵值對中數據由逗號分隔花括號表示對象方括號表示數組。創建一個對象為對象添加屬性創建數組將對象添加到數組將數組添加到對象將對象轉化成字符串參考文檔官網 JSON概述 JSON即javascript object notation,是javascript對象表示法的子集。具有以下特點: 數據放在鍵值對中; 數據由逗號分隔; 花括號表示對...
閱讀 2033·2023-04-25 23:30
閱讀 1455·2021-11-24 10:18
閱讀 3079·2021-10-09 09:54
閱讀 2021·2021-10-08 10:05
閱讀 3436·2021-09-23 11:21
閱讀 3165·2019-08-30 15:52
閱讀 1563·2019-08-30 13:05
閱讀 1061·2019-08-30 13:02