json是半結構化數據,java只能簡單解析,很難進行深度計算。集算器支持集合運算、有序計算、動態腳本執行,可降低json的計算難度。集算器還提供了簡單易用的JDBC接口,JAVA可將集算器腳本文件當做數據庫存儲過程執行,傳入參數并用JDBC獲得返回結果,詳情參考集算器用作Java計算類庫的應用結構。
下面舉例說明JAVA處理json時常見的難題,以及集算器對應的解法。
json分組匯總
order.json存儲著訂單記錄,現在要按時間段匯總每個月每個客戶貢獻的銷售額,部分源數據如下:
集算器代碼:
| A |
1 | =file(“D://order.json”).read().import@j() |
2 | =A1.select(OrderDate>=argBegin && OrderDate<=argEnd) |
3 | =A2.groups(month(OrderDate):Month,Client;sum(Amount):subtotal) |
將json文件讀為二維表,進行性條件查詢,再進行分組匯總,其中argBegin、argEnd是JAVA參數。結果如下:
解析字段不定的json
Data.json每個文檔的字段數不定,字段順序不定,如下:
需要用JAVA程序將該文件輸出到csv,期望的格式如下:
集算器代碼:
1 | =file(“d://data.json”).read().import@j() |
2 | =A1.People |
3 | =file(“D://result.csv”).export(A2;”,”) |
將json讀入內存,取出People字段,以逗號為分隔符寫入文件,其中A2如下:
將多層json輸出為csv
源json文件如下:
期望在CSV中分兩列擺放,如下:
難點在于root的字段名要和下級合并,下級字段名和字段值要各對應結果中的一列。集算器代碼:
1 | =file(“d://source.json”).read().import@j() |
2 | =A1.fno().(pjoin([f=A1.field(~)].fname():key,f.array():value)) |
3 | =A2.(~.record@i([A1.fname(#),null],1)) |
4 | =A3.conj() |
5 | =file(“D://result.csv”).export(A4;”,”) |
讀入json文件,將數據按root數分為3組,如下(A2):
之后將[root字段名,null]作為記錄插入各組第1條,再合并各組記錄,最后導出。Csv文件如下:
動態json入庫
s.json包含多層子文檔,其LIST子文檔和SERVICE子文檔的字段數不定,要求用JAVA將s.json導入庫表groups和service,規則是GROUPNAME的值和SERVICE的字段名對應數據庫表groups,SERVICE的每個字段對應庫表service,groups和service以groupsid相關聯。
源數據如下:
集算器代碼:
| A | B | C | D | |
1 | =file(“E://s.json”).read().import@j() | ||||
2 | =create(Groupname,groupid) | ||||
3 | =create(Serviceid,Servicename,groupid,Credit,Time,INFO,Network,Mobile,PRovider, PIN,KBH,MEP,PRD,Type,Locks,Reference) | ||||
4 | for A1.SUCCESS | =A4.LIST | |||
5 | for B4.fno() | =B4.field(B5) | |||
6 | =C5.SERVICES | ||||
7 | for C6.fno() | =C6.fname(C7) | |||
8 | =C6.field(C7) | ||||
9 | =A2.record([C5.GROUPNAME,D7]) | ||||
10 | =A3.record([D8.#1,D8.#2,D7,D8.#3,D8.#4, D8.#5,D8.#6,D8.#7,D8.#8,D8.#9, D8.#10,D8.#11,D8.#12,D8.#13, D8.#14,D8.#15]) | ||||
11 | =mssql.update(A2,groups,Groupname,groupid;groupid) | ||||
12 | =mssql.update(A3,services,Serviceid,Servicename,groupid,Credit,Time,INFO,Network, Mobile,Provider,PIN,KBH,MEP,PRD,Type,Locks,Reference;Serviceid) |
保持結構讀入json文件,分別循環SUCCESS的每個子文檔(B4-D10)、List的每個字段(C5-D10)、Service的每個字段(D7-D10),將對應的記錄追加到空二維表A2、A3,最后入庫。代碼中用到了訪問二維表結構的幾個函數,其中fno可取得字段數,fname按序號取得字段名,field可按序號取得字段值。
追加記錄后A2、A3分別如下:
新聞熱點
疑難解答