JSON 作為輕量級數據交換格式,廣泛用於 API 響應、配置文件、日志存儲。集算報表 (RaqReport) 通過內置集算器腳本 (SPL) 原生支持 JSON 文件讀取、解析、計算,並無縫對接 HTTP 數據源。本文通過兩個完整案例:學生成績排名 (平坦 JSON) 和 訂單-明細主從報表 (層次 JSON),演示腳本開發、數據集配置、報表模板設計全流程。
[
{"class":"Class One","id":1,"name":"Emily","subject":"English","score":84},
{"class":"Class One","id":1,"name":"Emily","subject":"Math","score":77},
...
{"class":"Class One","id":7,"name":"Nicholas","subject":"PE","score":60}
]
A1 = json(file("score.json").read()).import@j() // 讀取並解析為序表
A2 = A1.groups(id; name, class, sum(score):total) // 按學生 ID 分組求總分
A3 = A2.sort(-total) // 總分降序
A4 = A3.new(class, name, total) // 選取輸出字段
return A4
關鍵函數:json() 解析、import@j() 轉序表、groups() 分組聚合、sort() 排序、new() 投影。
p1.dfx (路徑相對於配置的 dfx 主目錄)。{class}, {name}, {total}。

若腳本不復用,可直接在報表中使用 **腳本數據集**,分步編寫 SPL,語法一致,可直接引用報表參數/數據源,減少文件維護。

[
{"OrderID":"10248","OrderDetails":[{"OrderID":"10248","ProductID":"5","UnitPrice":12,"Discount":0,"Quantity":1}],
"CustomerID":"VINET","ShippedDate":"2000-07-16","RequiredDate":"1996-08-01","Freight":32.38},
{"OrderID":"10325","OrderDetails":[{"OrderID":"10325","ProductID":"31","UnitPrice":10,"Discount":0,"Quantity":4},
{"OrderID":"10325","ProductID":"72","UnitPrice":27.8,"Discount":0,"Quantity":40}],
"CustomerID":"KOENE","ShippedDate":"1996-10-14","RequiredDate":"1996-10-23","Freight":64.86}
...
]
特點:頂層數組元素為訂單對象,包含嵌套數組 OrderDetails 明細。
A1 = json(file("orders.json").read()).import@j() // 直接解析為層次序表
return A1
神奇之處:集算器自動識別嵌套結構,生成**層次數據集** (父子行集),報表原生支持層次數據集的主從帶表展示。
p2.dfx,識別為層次數據集。OrderID, CustomerID, Freight...)。ProductID, UnitPrice, Quantity...),設置 Detail 屬性關聯父帶。

若 JSON 來自 HTTP API (如 Servlet、REST 端點),腳本只需修改第一行:
A1 = json(httpfile("https://192.168.1.101:6001/demo/Servlet?action=4&name=report1", "GBK").read()).import@j()
httpfile() 支持任意 HTTP 端點,返回文本/JSON/XML/CSV/Excel 均可後續處理。參數化 URL 可實現動態查詢。

集算報表通過 **SPL 腳本 + 原生 JSON/HTTP 支持 + 層次數據集**,將「數據獲取 → 解析 → 計算 → 展示」鏈路極大簡化:
這體現了現代報表工具**多源異構數據集成**的核心價值:以計算引擎統一異構數據訪問,讓報表開發聚焦於業務邏輯與呈現。