JsonBuilder初出茅廬

  互聯網這股東風不久前刮到了甘涼國,國王老甘獨具慧眼,想趕緊趁著東風未停大力發展移動互聯網,因為他篤信布斯雷的理論:“站在風口上,豬都能飛起來”。無奈地方偏僻落后,國內無可用之才啊。老甘一籌莫展的低頭凝思應聲被打斷,“啟奏陛下,有四個從東土大唐來的和尚前來更換通關文牒”,聽到“東土大唐”四個字,老甘心頭一喜,答道:“請他們去正堂等候”。

唐僧:貧僧唐三藏,自東土大唐而來,前往西天拜佛求經,今途徑貴國,懇請陛下更換通關文牒。
國王:高僧從東方而來,想必對互聯網略知一二。
唐僧:貧僧也是略有耳聞,不過我的徒兒對此頗有研究。
國王:寡人現有一需求,還請高僧幫忙處理一下,事成之后,定放你們西行。需求文檔一會發你。
唐僧:遵命,謝陛下。
國王:(發文檔),@三藏。
唐僧:收到。
唐僧:@悟凈,處理下文檔中的需求。
沙僧:收到。

  對接接口繁瑣復雜,還要多方聯調。悟空雖然水平高,但是脾氣不好,怕打起來;八戒好吃懶惰,恐難當此任;悟凈,為師只有辛苦你了。唐僧心里想到此,不由得嘆氣一聲。

沙僧:師傅,這文檔寫的亂七八糟、語句不通,很多入參、出參模糊不清,對方測試環境時好時壞,給他們打電話,他們說很忙暫時沒時間管我。
唐僧:悟凈,這些為師都知道。程序員都沒什么文化,注釋、文檔總是寫不好;而且非常苦逼,總是熬夜加班,所以沒有時間。你應該理解以下。
沙僧:哎。。。入參報文格式為json,且非常復雜,我拼了一上午報文,每次都返回入參報文格式不正確。
唐僧:你是怎么拼json格式的報文呢?
沙僧:傳統方法啊,先用Map和List組合好,再轉成json字符串。
唐僧:如果json非常復雜的話,要定義好多Map和List,光起些好點兒的名字就夠頭大的,還要再互相嵌套起來,稍有不慎,很容易出錯。真是夠夠的了。而且要寫很多代碼。
沙僧:誰說不是呢,師傅有什么好方法嗎?
唐僧:json結構你應該很熟悉,它是一個自我嵌套的遞歸結構。那我們就來設計一個構建器來直接構建json字符串,就叫JsonBuilder吧。
沙僧:我突然想起StringBuilder,它的流式api非常好用,快捷方便。只是字符串是一維的,只有先后順序,但json是二維的,既有先后順序,還有內外順序。
唐僧:你說的內外順序其實就是父子關系,這也很好處理。
  1)只需維護一個指向當前級別的指針,如果只是添加簡單的key-value,當前級別保持不變。
  2)如果添加了復合value(子節點),當前指針指向新添加的級別(深入一級),此時該級別就成了新的當前級別。
  3)當前級別結束后只需回到父級別(退出一級),此時父級別就又成了新的當前級別,如此往復下去即可。
沙僧:師傅,恕徒兒愚鈍,您講的太抽象了,能不能舉個例子。
唐僧:看下面的json,

{
? "string":"編程新說",
? "int":33,
? "boolean":true,
? "double":3.14,
? "null":null,
? "sub1":{
??? "string":"編程新說",
??? "int":33,
??? "boolean":true,
??? "double":3.14,
??? "null":null
? },
? "sub2":[
??? {
????? "string":"編程新說",
????? "int":33,
????? "boolean":true,
????? "double":3.14,
????? "null":null
??? },
??? {
????? "string":"編程新說",
????? "int":33,
????? "boolean":true,
????? "double":3.14,
????? "null":null
??? }
? ],
? "sub3":[
??? "編程新說",
??? 33,
??? true,
??? 3.14,
??? null
? ]
}
  1)首先指針指向最外層級別,此時添加5個簡單的key-value,整個添加過程級別保持不變,即這5個值都添加給了當前級別。
  2)然后添加sub1節點,它是一個復合節點,所以當前指針指向新添加的節點級別,此時添加5個簡單的key-value,都添加給了sub1,結束后指針回退到上一級。
  3)此時再添加sub2,當前指針指向sub2,因sub2是一個數組,也是復合節點。
  4)數組里包含的又是復合節點,只不過沒有名字而已。添加一個無名字節點,當前指針指向該節點,此時可以為它添加5個key-value,然后回到上一級,即數組級別
  5)然后添加第二個無名字節點,為它添加5個key-value,回到上一級,再回到上一級。
  6)然后添加sub3,因為它的value都是簡單值,所以添加value時當前級別不變,停留在數組級別。完成之后回到上一級,即最外層級別。
沙僧:這么一講解倒是非常直觀,層次也很清晰,所見即所得。還是師傅厲害。
唐僧:為師也沒那么厲害了,只是趁著你們打妖怪的時候,多琢磨了一會兒。說起來簡單,實現起來還是有些許難度的,要不你來試試。可以參考這個示例。

JsonBuilder jb = new JsonBuilder();
jb.kv("string", "編程新說")
.kv("int", 33)
.kv("boolean", true)
.kv("double", 3.14)
.kv("null", null)
.ko("sub1")
?? ?.kv("string", "編程新說")
?? ?.kv("int", 33)
?? ?.kv("boolean", true)
?? ?.kv("double", 3.14)
?? ?.kv("null", null)
.end()
.ka("sub2")
?? ?.io()
?? ??? ?.kv("string", "編程新說")
?? ??? ?.kv("int", 33)
?? ??? ?.kv("boolean", true)
?? ??? ?.kv("double", 3.14)
?? ??? ?.kv("null", null)
?? ?.end()
?? ?.io()
?? ??? ?.kv("string", "編程新說")
?? ??? ?.kv("int", 33)
?? ??? ?.kv("boolean", true)
?? ??? ?.kv("double", 3.14)
?? ??? ?.kv("null", null)
?? ?.end()
.end()
.ka("sub3")
?? ?.iv("編程新說")
?? ?.iv(33)
?? ?.iv(true)
?? ?.iv(3.14)
?? ?.iv(null)
.end();
沙僧:好的,只是這變量名字有點。。。但別光我一人啊,也讓廣大群眾試試吧。

  悟凈得到師傅的指點后,有一點小小的豁然開朗,決定自己去實現一把。但想到又開始去對接口,不由得嘆氣一聲,哎。。。

?

PS:也可以按照此方法寫一個MapBuilder。
PS:也可以按照此方法寫一個XmlBuilder。

?

?

(完)

?

編程新說


用獨特的視角說技術

?

轉載于:https://www.cnblogs.com/lixinjie/p/json-builder.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/249901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/249901.shtml
英文地址,請注明出處:http://en.pswp.cn/news/249901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue-cli 打包部署

1、一般打包 :直接 npm run build。(webpack的文件,根據不同的命令,執行不同的代碼的) 注:這種打包的靜態文件,只能放在web服務器中的根目錄下才能運行。 2、在服務器中 非根目錄下 運行的 打包…

EXCEL怎么打20位以上的數字?

EXCEL怎么打20位以上的數字? 轉載于:https://www.cnblogs.com/macT/p/10208794.html

vue render函數

Vue中的Render渲染函數 VUE一般使用template來創建HTML&#xff0c;然后在有的時候&#xff0c;我們需要使用javascript來創建html&#xff0c;這時候我們需要使用render函數。比如如下我想要實現如下html&#xff1a; <div id"container"><h1><a hre…

Nexus介紹

轉自&#xff1a;https://www.cnblogs.com/wincai/p/5599282.html 開始在使用Maven時&#xff0c;總是會聽到nexus這個詞&#xff0c;一會兒maven&#xff0c;一會兒nexus&#xff0c;當時很是困惑&#xff0c;nexus是什么呢&#xff0c;為什么它總是和maven一起被提到呢&#…

vue-cli 打包

一項目打包 1 打包的配置在 build/webpack.base.conf.js文件下 常量config在vue/config/index.js 文件下配置&#xff0c;__dirname是定義在項目的全局變量&#xff0c;是當前文件所在項目的文件夾的絕對路徑。 2 需要修改vue/config/index.js 文件下的將build對象下的assets…

乘風破浪:LeetCode真題_010_Regular Expression Matching

乘風破浪&#xff1a;LeetCode真題_010_Regular Expression Matching 一、前言 關于正則表達式我們使用得非常多&#xff0c;但是如果讓我們自己寫一個&#xff0c;卻是有非常大的困難的&#xff0c;我們可能想到狀態機&#xff0c;確定&#xff0c;非確定狀態機確實是一種解決…

python——獲取數據類型

在python中&#xff0c;可使用type()和isinstance()內置函數獲取數據類型 如&#xff1a; &#xff08;1&#xff09;type()的使用方法&#xff1a;    >>> a 230 >>> type(a) <class str> >>> a 230 …

vue項目工程中npm run dev 到底做了什么

npm install 安裝了webpack框架中package.json中所需要的依賴 2.安裝完成之后&#xff0c;需要啟動整個項目運行&#xff0c;npm run 其實執行了package.json中的script腳本&#xff0c;npm run dev的執行如下 3.底層相當執行webpack-dev-server --inline --progress --confi…

JavaScript回顧與學習——條件語句

一、if...else // if elsevar age 16;if(0 < age && age < 6){console.log("兒童");}else if(6 < age && age < 14){console.log("少年");}else if(14 < age && age < 35){console.log("青年");}els…

bat等大公司常考java多線程面試題

1、說說進程,線程,協程之間的區別 簡而言之,進程是程序運行和資源分配的基本單位,一個程序至少有一個進程,一個進程至少有一個線程.進程在執行過程中擁有獨立的內存單元,而多個線程共享內存資源,減少切換次數,從而效率更高.線程是進程的一個實體,是cpu調度和分派的基本單位,是比…

webpack.config.js和package.json

webpack.config.js 是webpakc的配置文件&#xff0c;webpack是當今很火的一個打包工具 使用webpack.config.js在你的項目里 可以對你的項目進行模塊化打包&#xff0c;并且也可使組件按需加載&#xff0c;還可將圖片變成base64格式減少網絡請求。 而package.json 是指你項目的…

七牛云圖片加載優化

?imageView2/2/w/80https://developer.qiniu.com/dora/manual/1279/basic-processing-images-imageview2 ?imageView2/1/w/80/h/80會裁剪 ?imageView2/3/w/80/h/80不會裁剪 轉載于:https://www.cnblogs.com/smzd/p/9025393.html

org.apache.maven.archiver.mavenarchiver.getmanifest怎么解決

原因就是你的maven的配置文件不是最新的 1.help ->Install New Software -> add ->https://otto.takari.io/content/sites/m2e.extras/m2eclipse-mavenarchiver/0.17.2/N/LATEST 或者&#xff08;更新于2018年4月18日17:07:53&#xff09; http://repo1.maven.org/mav…

npm中package.json詳解

通常我們使用npm init命令來創建一個npm程序時&#xff0c;會自動生成一個package.json文件。package.json文件會描述這個NPM包的所有相關信息&#xff0c;包括作者、簡介、包依賴、構建等信息&#xff0c;格式是嚴格的JSON格式。 常用命令 npm i --save packageName 安裝依賴…

offset系列,client系列,scroll系列回顧

一 scroll系列屬性 ——滾動1 scrollHeight/scrollWidth 標簽內部實際內容的高度/寬度ele.scrollHeight 有兩種情況&#xff0c;當內容超出盒子范圍后&#xff0c;返回的是內容的高度&#xff0c;包括padding&#xff0c;從頂部內側到內容的最外部分。當內容不超出盒子范圍…

項目開發中的自我總結

最近忙的要死,因為新開發了兩個項目.現在已經測試完畢了,準備部署到線上了. 然后不能白忙活吧,忙活完也得寫點總結和經驗吧,以后也有個記錄. 1.一個bootstrapjquerylayuilaravel 5.4開發的一個后臺系統 比較樸素 2.一個前后端分離的vuelaravel 5.4 開發的商家系統 我只負責后端…

webpack.config.js 參數詳解

webpack.config.js文件通常放在項目的根目錄中&#xff0c;它本身也是一個標準的Commonjs規范的模塊。 var webpack require(webpack); module.exports {entry: [webpack/hot/only-dev-server,./js/app.js],output: {path: ./build,filename: bundle.js},module: {loaders: …

數組黑科技(偏性能方面)未完待更新...

數組去重最優解&#xff1a;Array.prototype.unique function () {var tmp new Map();return this.filter(item > {return !tmp.has(item) && tmp.set(item,1);})}搭配使用 Array.from(foo); // ["f", "o", "o"]let s new Set([f…

控制臺添加log4net

1.添加nuget包 log4net 2.app.config配置 <?xml version"1.0" encoding"utf-8"?> <configuration> <configSections><section name"log4net" type"log4net.Config.Log4NetConfigurationSectionHandler, log4net&quo…

記一次vue 普通異步請求微信二進制二維碼 亂碼 問題解決然后渲染

后端壓力大&#xff0c;前端分憂。 /*用微信小程序token拿二維碼*/ async fetchMINIQRcode({commit,state},params){var instance axios.create({responseType: blob, //返回數據的格式&#xff0c;可選值為arraybuffer,blob,document,json,text,stream&#xff0c;默認值為js…