網際網路這股東風不久前颳到了甘涼國,國王老甘獨具慧眼,想趕緊趁著東風未停大力發展移動網際網路,因為他篤信布斯雷的理論:「站在風口上,豬都能飛起來」。無奈地方偏僻落後,國內無可用之才啊。老甘一籌莫展的低頭凝思應聲被打斷,「啟奏陛下,有四個從東土大唐來的和尚前來更換通關文牒」,聽到「東土大唐」四個字,老甘心頭一喜,答道:「請他們去正堂等候」。
唐僧:貧僧唐三藏,自東土大唐而來,前往西天拜佛求經,今途徑貴國,懇請陛下更換通關文牒。
國王:高僧從東方而來,想必對網際網路略知一二。
唐僧:貧僧也是略有耳聞,不過我的徒兒對此頗有研究。
國王:寡人現有一需求,還請高僧幫忙處理一下,事成之後,定放你們西行。需求文件一會發你。
唐僧:遵命,謝陛下。
國王:(發文件),@三藏。
唐僧:收到。
唐僧:@悟淨,處理下文件中的需求。
沙僧:收到。
對接介面繁瑣複雜,還要多方聯調。悟空雖然水平高,但是脾氣不好,怕打起來;八戒好吃懶惰,恐難當此任;悟淨,為師只有辛苦你了。唐僧心裡想到此,不由得嘆氣一聲。
沙僧:師傅,這文件寫的亂七八糟、語句不通,很多入參、出參模糊不清,對方測試環境時好時壞,給他們打**,他們說很忙暫時沒時間管我。
唐僧:悟淨,這些為師都知道。程式設計師都沒什麼文化,注釋、文件總是寫不好;而且非常苦逼,總是熬夜加班,所以沒有時間。你應該理解以下。
沙僧:哎。。。入參報文格式為json,且非常複雜,我拼了一上午報文,每次都返回入參報文格式不正確。
唐僧:你是怎麼拼json格式的報文呢?
沙僧:傳統方法啊,先用map和list組合好,再轉成json字串。
唐僧:如果json非常複雜的話,要定義好多map和list,光起些好點兒的名字就夠頭大的,還要再互相巢狀起來,稍有不慎,很容易出錯。真是夠夠的了。而且要寫很多**。
沙僧:誰說不是呢,師傅有什麼好方法嗎?
唐僧:json結構你應該很熟悉,它是乙個自我巢狀的遞迴結構。那我們就來設計乙個構建器來直接構建json字串,就叫jsonbuilder吧。
沙僧:我突然想起stringbuilder,它的流式api非常好用,快捷方便。只是字串是一維的,只有先後順序,但json是二維的,既有先後順序,還有內外順序。
唐僧:你說的內外順序其實就是父子關係,這也很好處理。
1)只需維護乙個指向當前級別的指標,如果只是新增簡單的key-value,當前級別保持不變。
2)如果新增了復合value(子節點),當前指標指向新新增的級別(深入一級),此時該級別就成了新的當前級別。
3)當前級別結束後只需回到父級別(退出一級),此時父級別就又成了新的當前級別,如此往復下去即可。
沙僧:師傅,恕徒兒愚鈍,您講的太抽象了,能不能舉個例子。
唐僧:看下面的json,
,"sub2":[,],
"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。
(完)程式設計新說
用獨特的視角說技術
CSS 初出茅廬
其實原來學過css,但是用的不多,不過最近忽然又使用的比較頻繁,所以複習一下,也順便做一下筆記。1 css宣告總是以分號 結束,宣告組以大括號 括起來 p 2 注釋用 這是注釋 3 id 和 class 選擇器 id選擇器 id 選擇器可以為標有特定 id 的 html 元素指定特定的樣式。html...
Mongodb之 初出茅廬
mongodb之 初出茅廬 首先,感謝cnblogs tv,感謝博主的tv,更感謝對上期分享支援的朋友們。在你們的支援,才有了讓我寫下這一期的動力。夜晚也許你在電視機邊看電視,也許你在網上看電影。而我在堅守了一天的電腦之後,繼續坐到了電腦邊,聽著北京廣播網的87.6,寫著技術分享。好了重點來了,也是...
16初出茅廬A題
a 牛牛 time limit 1000ms memory limit 65535k 題型 程式設計題 語言 無限制 描述 最近hl看到舍友在回顧星爺,發哥,瓦仔的 賭.系列電影,然後就跟他們玩起撲克來。撲克裡面有一種簡單的玩法,叫做 牛牛 眾所周知,一副撲克除去大小王之後剩下52張。2 9,t 相...