如何使用JasperReports JSON元数据导出器生成嵌套对象数组
错误原因
JasperReports的Json元数据导出器是完全跟着报表模板的元素层级映射JSON结构的,不是光靠schema和字段路径就能自动推断嵌套边界。你之前的配置只给字段加了person.前缀的路径,没在模板里给person这个嵌套对象绑定对应的容器元素,导出器处理第一条数据的时候会临时创建一次person对象装字段,后面两条数据找不到和person层级绑定的元素锚点,就直接把字段平铺到外层对象上,才会出现只有第一条数据在person节点下、剩下的都堆在外层的畸形结果。
扁平结构能正常导出,是因为数组下的直接子对象刚好和Detail带区本身的默认层级匹配,不需要额外加容器做锚点。
正确配置方法
- 打开报表的Detail带区,拖入一个Frame容器,把原来放
firstName、lastName的两个文本字段全部挪到这个Frame内部。 - 选中这个Frame,给它添加JSON路径属性:
<property name="net.sf.jasperreports.export.json.path" value="person"/> - 之前写的嵌套结构schema、两个文本字段上的
person.firstName/person.lastName路径属性都不用调整,直接执行导出即可。
配置完成后就能得到符合预期的输出结果:
[ { "person": { "firstName": "john", "lastName": "carter" } }, { "person": { "firstName": "mary", "lastName": "ann" } }, { "person": { "firstName": "jack", "lastName": "thomas" } } ]
补充规则:后续如果要实现更复杂的多层嵌套、嵌套数组结构,每一层JSON对象/数组都要在模板里对应一个容器(Frame对应普通对象,列表组件/子报表对应数组),给容器配置对应层级的JSON路径,再把内层字段/子容器放到对应父容器内部,导出器才能正确识别层级边界,不会出现结构错乱。
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

