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。

 

 

(完)

 

編程新說


用獨特的視角說技術

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM