Jasper Reports JSON数据源获取空值

我正在使用Jasper Reports来构建一个简单的报告pdf。 我有一个看起来像这样的JSON文件:

{"employees": [ {"firstName" : "John", "lastName" : "Doe"}, {"firstName" : "Anna", "lastName" : "Smith"}, {"firstName" : "Peter", "lastName" : "Jones"} ]} 

而我正试图像这样阅读:

 File file = new File("E:/Workspaces/jasperPDFreport/src/main/resources/emp.json"); JsonDataSource datasource = new JsonDataSource(file); JasperDesign jasperDesign = JRXmlLoader .load("E:/Workspaces/jasperPDFreport/src/main/resources/jsonTemplate.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); Map parameters = new HashMap(); JasperPrint jasperPrint; jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, datasource); JasperExportManager.exportReportToPdfFile(jasperPrint, "BasicReport.pdf"); JasperViewer.viewReport(jasperPrint); 

但是我的JSON文件中的值不会传递给我的pdf。

这是我的模板:

                                       

现在你看到注释掉的行了

property name =“net.sf.jasperreports.json.source”value =“emp.json”

如果我对此进行评论,一切都按预期工作,我不想将我的JSON值硬编码到模板中,因为稍后我想从rest服务中获取它们,这还没有准备好。 我不明白,为什么这些值没有被解析到报告中,而是我得到两个空值。

来自JasperReports – JSON数据源示例(版本6.4.3)

内置的JSON查询执行器(请参阅JsonQueryExecuter类)是一种工具,它使用查询字符串根据特定的内置参数(或等效的报表属性)生成JsonDataSource实例。 此查询执行程序通过JsonQueryExecuterFactory工厂类注册。 为了准备数据源,JSON查询执行器以java.io.InputStream的forms查找包含JSON源对象的JSON_INPUT_STREAM参数。 如果未提供JSON_INPUT_STREAM参数,则查询执行器将查找备用net.sf.jasperreports.json.source字符串参数或报告属性,该属性存储JSON源文件位置的路径。 JsonQueryExecuter在输入源上运行查询,并将结果存储在内存中的JsonDataSource对象中。

所以,如果你不想使用:

  

您需要在参数JSON_INPUT_STREAM文件作为java.io.InputStream JSON_INPUT_STREAM

因此,您当前正在将其作为数据源传递,您应该尝试这样的事情

 params.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, new FileInputStream(file)); JasperFillManager.fillReportToFile(jasperReport, params); 

如果您将json字符串作为InputStream传递,那么它将起作用。

 String reportContents = "{}" //your json InputStream is = new ByteArrayInputStream(reportContent.getBytes()); Map params = new HashMap(); params.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, is); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params); 

看一下包装JavaBean对象集合的数据源实现。

 List yourBeanCollection = queryDataFromJSON(); JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(yourBeanCollection); JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, reportParams, beanCollectionDataSource); 

并在报告模板中导入java.util并声明您在报告中“注入”的集合

   

另请看这里的例子