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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

JsonBuilder初出茅庐

發(fā)布時(shí)間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JsonBuilder初出茅庐 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  互聯(lián)網(wǎng)這股東風(fēng)不久前刮到了甘涼國(guó),國(guó)王老甘獨(dú)具慧眼,想趕緊趁著東風(fēng)未停大力發(fā)展移動(dòng)互聯(lián)網(wǎng),因?yàn)樗V信布斯雷的理論:“站在風(fēng)口上,豬都能飛起來(lái)”。無(wú)奈地方偏僻落后,國(guó)內(nèi)無(wú)可用之才啊。老甘一籌莫展的低頭凝思應(yīng)聲被打斷,“啟奏陛下,有四個(gè)從東土大唐來(lái)的和尚前來(lái)更換通關(guān)文牒”,聽(tīng)到“東土大唐”四個(gè)字,老甘心頭一喜,答道:“請(qǐng)他們?nèi)フ玫群颉薄?/p>

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

  對(duì)接接口繁瑣復(fù)雜,還要多方聯(lián)調(diào)。悟空雖然水平高,但是脾氣不好,怕打起來(lái);八戒好吃懶惰,恐難當(dāng)此任;悟凈,為師只有辛苦你了。唐僧心里想到此,不由得嘆氣一聲。

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

{
? "string":"編程新說(shuō)",
? "int":33,
? "boolean":true,
? "double":3.14,
? "null":null,
? "sub1":{
??? "string":"編程新說(shuō)",
??? "int":33,
??? "boolean":true,
??? "double":3.14,
??? "null":null
? },
? "sub2":[
??? {
????? "string":"編程新說(shuō)",
????? "int":33,
????? "boolean":true,
????? "double":3.14,
????? "null":null
??? },
??? {
????? "string":"編程新說(shuō)",
????? "int":33,
????? "boolean":true,
????? "double":3.14,
????? "null":null
??? }
? ],
? "sub3":[
??? "編程新說(shuō)",
??? 33,
??? true,
??? 3.14,
??? null
? ]
}
  1)首先指針指向最外層級(jí)別,此時(shí)添加5個(gè)簡(jiǎn)單的key-value,整個(gè)添加過(guò)程級(jí)別保持不變,即這5個(gè)值都添加給了當(dāng)前級(jí)別。
  2)然后添加sub1節(jié)點(diǎn),它是一個(gè)復(fù)合節(jié)點(diǎn),所以當(dāng)前指針指向新添加的節(jié)點(diǎn)級(jí)別,此時(shí)添加5個(gè)簡(jiǎn)單的key-value,都添加給了sub1,結(jié)束后指針回退到上一級(jí)。
  3)此時(shí)再添加sub2,當(dāng)前指針指向sub2,因sub2是一個(gè)數(shù)組,也是復(fù)合節(jié)點(diǎn)。
  4)數(shù)組里包含的又是復(fù)合節(jié)點(diǎn),只不過(guò)沒(méi)有名字而已。添加一個(gè)無(wú)名字節(jié)點(diǎn),當(dāng)前指針指向該節(jié)點(diǎn),此時(shí)可以為它添加5個(gè)key-value,然后回到上一級(jí),即數(shù)組級(jí)別
  5)然后添加第二個(gè)無(wú)名字節(jié)點(diǎn),為它添加5個(gè)key-value,回到上一級(jí),再回到上一級(jí)。
  6)然后添加sub3,因?yàn)樗膙alue都是簡(jiǎn)單值,所以添加value時(shí)當(dāng)前級(jí)別不變,停留在數(shù)組級(jí)別。完成之后回到上一級(jí),即最外層級(jí)別。
沙僧:這么一講解倒是非常直觀,層次也很清晰,所見(jiàn)即所得。還是師傅厲害。
唐僧:為師也沒(méi)那么厲害了,只是趁著你們打妖怪的時(shí)候,多琢磨了一會(huì)兒。說(shuō)起來(lái)簡(jiǎn)單,實(shí)現(xiàn)起來(lái)還是有些許難度的,要不你來(lái)試試??梢詤⒖歼@個(gè)示例。

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

  悟凈得到師傅的指點(diǎn)后,有一點(diǎn)小小的豁然開(kāi)朗,決定自己去實(shí)現(xiàn)一把。但想到又開(kāi)始去對(duì)接口,不由得嘆氣一聲,哎。。。

?

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

?

?

(完)

?

編程新說(shuō)


用獨(dú)特的視角說(shuō)技術(shù)

?

轉(zhuǎn)載于:https://www.cnblogs.com/lixinjie/p/json-builder.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的JsonBuilder初出茅庐的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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