报表工具怎样使用 Json/XML 的数据

 

Json/XML是多层结构的数据,很多报表工具没有直接支持,必须引入相关的第三方类库,比如JsonPath/Dom4J。这些类库计算能力较弱,代码繁琐冗长,集成过程也很麻烦。有些报表工具封装了这些类库,优点是可以提供友好的取数向导,也替用户省去了集成的麻烦,但封装解决不了计算问题,只能推给报表工具。报表工具专注展现,较简单的计算勉强能实现,复杂些的就要依靠自定义数据集了,代码依旧繁琐冗长。

更好的办法是用JAVA开源计算类库SPL,既有方便的Json/XML解析函数,又有强大的多层数据计算能力,还有易于被报表集成的JDBC接口。

SPL内置Json/XML解析函数,可以方便地读取数据。比如某Json文件是多层结构,由多条员工记录及员工的多个订单组成,用SPL取所有的员工记录:


A

1

=json(file("d:/Orders.json").read())

2

=json(A1)

取所有的订单记录:


A

1

=json(file("d:/Orders.json").read())

2

=json(A1).conj()

XML的解析思路与Json基本一致,唯一的区别是须指定记录所在的节点路径名。比如某XML文件与前面的Json同构,下面读取所有订单:


A

1

=xml(file("d:/Orders.xml").read(),"xml/row")

2

=json(A1).conj()

 

SPL内置丰富的计算函数,可以用简单直观的语法计算多层数据,从而避免繁琐的硬编码。比如对订单进行区间查询,其中p_startp_end是参数:


A

2

…//取得所有订单

3

=A2.select(Amount>p_start   && Amount<=p_end)

SPL计算语法通用于各类数据源XMLJson只是取数过程不同,计算代码没区别,这里不再分开说明。

 

SPL提供了JDBC驱动,可以被报表工具方便地集成。对于上面的区间查询,先存为脚本文件intervalQuery.splx,再在报表工具里以存储过程的形式调用脚本文件名。以JasperReport为例,可写作:

call intervalQuery($P{paramStart}, $P{paramEnd})

再举几例:


A

B

2

…//取得员工记录


3

=A2.conj().select(Amount>1000   && like(Client,\"*S*\"))

/模糊查询

4

=A2.conj(Orders).groups(Client;sum(Amount))

/多层数据分组汇总

5

=A2.groups(State,Gender;avg(Salary),count(1))

/单层数据分组汇总

6

=A2.sort(Salary)

/排序

7

=A2.id(State)

/去重

8

=A2.new(Name,Gender,Dept,Orders.OrderID,Orders.Client,Orders.Client,Orders.SellerId,Orders.Amount,Orders.OrderDate)

/关联

 

SPL可以从多种来源里读取Json/XML,除了本地文件,也支持局域网、FTPHDFSWebServiceRestful等。比如从Restful读取json串,对订单进行区间查询:


A

1

=httpfile("http://127.0.0.1:8086/api/getOrders").read()

2

=json(A1).conj()

3

=A2.select(Amount>p_start &&   Amount<=p_end)


 

SPL还提供了标准SQL语法,可有效降低学习门槛,适合代码短难度低的计算。比如区间查询,可以在报表工具中建立SQL数据集,并编写如下SQL语句:

$select * from {json(file("d:/Orders.json").read()).conj()}
where Amount>$P{paramStart} and Amount<=$P{paramEnd}

再比如两个json的关联:

$select e.name, s.orderdate, s.amount from {json(file("d:/sales.json").read())}  s left join { json(file("d:/employees.json").read())} e on s.sellerid= e.eid

更多例子参考在文件上使用 SQL 查询的示例

 

SPL具有强大的计算能力,可简化分步计算、有序计算、分组后计算等逻辑较复杂的计算,很多SQL很难实现的计算,用SPL解决起来就很轻松。比如,找出销售额累计占到一半的前n个大客户,并按销售额从大到小排序:


A

B

1

 /取数据

2

=A1.sort(amount:-1)

/销售额逆序排序

3

=A2.cumulate(amount)

/计算累计序列

4

=A3.m(-1)/2

/最后的累计即总额

5

=A3.pselect(~>=A4)

/超过一半的位置

6

=A2(to(A5))

/按位置取值

SPL提供了专业的IDE,不仅具备完整的调试功能,还能以表格的形式观察每一步的计算结果,适合开发逻辑较复杂的计算。

IDEpng

除了Json/XML之外,SPL还支持txtcsvxls等多种文件,以及MongoDBHadoopredisElasticSearchSalesForceCassandra等多种NoSQL,以及不同数据源/数据库之间的混合计算。