JSON是半結構化數據,Java和報表工具只提供了簡單解析的類庫,很難進行深度計算。而使用集算器可降低JSON的計算難度。報表工具可將集算器腳本文件當做數據庫存儲過程執行,傳入參數並用JDBC獲得返回結果,詳情參考集算器輔助報表工具的應用過程。
下面舉例說明報表工具呈現JSON時常見的難題,以及集算器對應的解法。
JSON分組彙總
order.json存儲着訂單記錄,現在要按時間段彙總每個月每個客戶貢獻的銷售額,部分源數據如下:
集算器代碼:
將JSON文件讀爲二維表,進行性條件查詢,再進行分組彙總,其中argBegin、argEnd是報表參數。結果如下:
用列表展現手機日誌
文件cellphone.log是JSON格式的手機日誌,其中general和ping字段是子文檔,分別有一條記錄,cap_main字段也是子文檔,有多條記錄,現在需要用列表呈現cap_main,每條記錄附加general的mtmodel 、networktype字段,以及ping的ssid字段。
源數據如下:
集算器代碼:
集算器讀入JSON文件後,將保持其多層結構,並可用句號延多層結構訪問字段。函數derive表示增加計算列。計算結果如下:
報表查詢JSON多層子文檔
jsonstr.json的runners字段是子文檔,子文檔有3個字段:horseId、ownerColours、trainer,其中trainer含有下級字段trainerId。報表需要根據文檔序號展現對應子文檔的horseId、ownerColours、trainerId字段。
源數據如下:
集算器代碼:
讀入JSON文件,按序號取出對應文檔的runner字段(子文檔),再從runner取出需要的字段,其中trainerId來自下級子文檔。A3就是報表需要的數據,如下:
多層JSON分組表
Cells.json是個多層嵌套的json文件,報表需要將其展示爲分組表,分組字段爲name、type、image. “xlink:href”,明細字段分爲3個部分:custom. Identifier、custom. Classifier、custom. Output,這3部分都是結構相同的子文檔,但文檔數不同。
源數據:
集算器代碼:
集算器可將3種子文檔合併在1個二維表中,用新字段ctype來區分,再將分組字段加入二維表,形成典型的“主子連接表”。合併後A2如下:
根據集算器的計算結果,報表很容易就可以設計出分組表。
多個子報表不同JSON
一張報表含有多個子報表,主報表和每個子報表使用不同的JSON文件,部分源數據如下:
對於Jasper、Birt等單源報表工具,需要用JAVA類將多源數據統一爲單源,集算器只需書寫簡單腳本:
讀入JSON並取出第1個字段,“.#1”表示第1個字段。給參數argFileName賦予不同的文件名,報表將會收到不同的數據集,如下:
連接txt和JSON
structure.txt是tab分割的結構化文本,json.txt是非結構化的JSON串,structure.txt的第2列和json.txt的部分文本存在外鍵關係。部分數據如下:
structure.txt
Json.txt
需要用報表呈現上述連接關係,期望表樣如下:
集算器代碼:
讀入JSON文件,取出必要的字段和子文檔形成二維表,然後新增計算列。A3如下:
之後讀入本文文件,再和A3進行join運算,並取出需要的字段,形成最終結果A6,如下: