JsonBuilder初出茅庐
互聯(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)題。
- 上一篇: 国内外12个免费域名解析服务网站推荐
- 下一篇: org.apache.maven.arc