如何使用JSON数据源填充报表而不获取空值?

时间:2015-10-23 10:52:39

标签: java json jasper-reports

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

rev2 :: [a] -> [a]
rev2 xs = go [] xs where
  go :: [a] -> [a] -> [a]  -- signature included for clarity
  go acc    []  =       acc
  go acc (x:xs) = go (x:acc) xs

我试图像这样阅读:

<?php

namespace App\Model\Table;

use App\Model\Entity\Member;
use Cake\ORM\Query;
use Cake\ORM\RulesChecker;
use Cake\ORM\Table;
use Cake\Validation\Validator;

class MembersTable extends Table {

    public function initialize(array $config) {
        parent::initialize($config);

        $this->table('members');
    }

    public function validationDefault(Validator $validator) {
        $validator
                ->add("cedula", [
                    "custom" => [
                        "rule" => [$this, "customFunction"], //add the new rule 'customFunction' to cedula field
                        "message" => "Enter the value greater than 1000"
                    ]
                        ]
                )
                ->notEmpty('cedula');
        return $validator;
    }

    public function customFunction($value, $context) {
        return $value > 1000;
    }

}

Use $context variable to comare current value with other fields like $value >= $context['data']['another_field_name'];

?>

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

这是我的模板:

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

现在你看到注释掉的行了

  

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

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

3 个答案:

答案 0 :(得分:8)

来自JasperReports - JSON Data Source Sample (version 6.4.3)

  

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

所以如果你不想使用:

<property name="net.sf.jasperreports.json.source" value="emp.json"/>

您需要在参数java.io.InputStream

中将文件作为JSON_INPUT_STREAM传递

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

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

如果您想使用新的JsonQLQueryExecuterFactory JSONQL Data Source

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

答案 1 :(得分:1)

如果您将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);

答案 2 :(得分:0)

查看包含JavaBean对象集合的数据源实现here

List<YourClass> yourBeanCollection = queryDataFromJSON();

JRDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(yourBeanCollection);

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,
                reportParams, beanCollectionDataSource);

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

<import value="java.util.*"/>
<field name="yourBeanCollection" class="java.util.List"/>

还可以查看here示例