JsonBuilder初出茅廬

来源:https://www.cnblogs.com/lixinjie/archive/2018/07/23/json-builder.html
-Advertisement-
Play Games

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


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

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

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

沙僧:師傅,這文檔寫的亂七八糟、語句不通,很多入參、出參模糊不清,對方測試環境時好時壞,給他們打電話,他們說很忙暫時沒時間管我。
唐僧:悟凈,這些為師都知道。程式員都沒什麼文化,註釋、文檔總是寫不好;而且非常苦逼,總是熬夜加班,所以沒有時間。你應該理解以下。
沙僧:哎。。。入參報文格式為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。

 

 

(完)

 

編程新說


用獨特的視角說技術

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 多線程之間通訊,其實就是多個線程在操作同一個資源,但是操作的動作不同。 第一個線程寫入count,另一個線程取讀取count的值.實現讀一個,寫一個操作。 小明,男 小明,女 小紅,女 小明,男數據格式發生錯誤?????System.out.println(res.username+","+res. ...
  • 設計模式不管對於何種語言都是存在的,這裡介紹的是java的模式 裝飾者模式是在二次開發中應用比較多的一款模式,當然了用反射也是可以實現的,今天介紹的是裝飾模式,有興趣的朋友可以自己去瞭解一下反射是怎麼實現的。 在實際的開發中是無法拿到源碼的,代碼的可使用性也被final了,所以最常見的二次開發(二次 ...
  • 本文內容: 什麼是流 位元組流 字元流 首發日期:2018-07-24 什麼是流 流是個抽象的概念,是對輸入輸出設備的抽象,輸入流可以看作一個輸入通道,輸出流可以看作一個輸出通道。 輸入流是相對程式而言的,外部傳入數據給程式需要藉助輸入流。 輸出流是相對程式而言的,程式把數據傳輸到外部需要藉助輸出流。 ...
  • 一、構造方法 在使用類創建對象的時候(就是類後面加括弧)就自動執行__init__方法。 Python中派生類可以繼承父類的構造方法 1.基於super() 遇到super()就表示去執行父類的xxx屬性 2.通過父類的名稱執行父類的構造方法。 這兩種方式中推薦super,使用第二中方法的時候,進行 ...
  • 原創 尋求圖中最短路徑的方法有很多,最近剛開始學習,先用深搜實現,用鄰接矩陣來存儲圖。 直接上圖上代碼: 尋求從0~4的最短路徑 利用深搜找出所有從0~4的路徑,一一比較選擇出最小的 測試數據: 輸入: 5 8 0 1 2 0 4 10 1 2 3 1 4 7 2 0 4 2 3 4 3 4 5 4 ...
  • java.io包下的File類用於描述和創建一個文件或文件夾對象,只能對文件或文件夾做一些簡單操作,不能修改文件的內容,功能比較有限。下麵是對於File類中常用方法的程式演示。 [1] 演示程式一 [2] 演示程式二 註:希望與各位讀者相互交流,共同學習進步。 ...
  • 在debug VS c工程文件時,碰到cannot convert from 'int (__cdecl *)(char *)' to 'xxx'這個問題,發現問題在於typedef函數指針類型時,將函數調用方法__cdecl寫成了_stdcall。 後來百度了兩者的區別,如下: __cdecl 是 ...
  • 需求分析 要做安全方面的內容,依靠人臉識別通過和庫中的臉比對後判定相似率來驗證用戶身份。 快速從圖片中識別出人的信息,用於尋人功能等。 其實從安全的角度出發有很多可以囊括的。比如智能家居中的刷臉開門,支付軟體的刷臉支付等都是例子。 人臉特征提取的步驟 真正的人臉識別需要很多的知識,大體上粗略的可以分 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...