我正在使用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值硬编码到模板中,因为稍后我想从休息服务中获取它们,但尚未准备好。我不明白,为什么这些值没有被解析到报告中,而是我只得到两个空值。
答案 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示例