【问题标题】:Optional fields from JSON datasource JasperReportsJSON 数据源 JasperReports 中的可选字段
【发布时间】:2017-01-05 22:00:45
【问题描述】:

我正在使用 JSON 数据源在 JasperReport 中创建报告。内部 iReport 字段被声明为 Integer。此字段在其他字段中的行中使用。

输入 JSON 示例:

[{
    "dateFrom": "01.12.2016",
    "dateTo": "01.12.2016",
    "someOptionalNumber": 12
},
{
    "dateFrom": "01.12.2016",
    "dateTo": "01.12.2016"
}, {
    "dateFrom": "01.12.2016",
    "dateTo": "01.12.2016",
    "someOptionalNumber": 11
}]

字段声明:

<field name="someOptionalNumber" class="java.lang.Integer"/> 

问题是在输入 JSON 中 someOptionalNumber 是可选的,因此并非每行都存在。字段可以是可选的吗?

当我运行这样的 JSON 时,我得到了这个错误:

原因:net.sf.jasperreports.engine.JRException:无法获取类“java.lang.Integer”的字段“someOptionalNumber”的值

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[JRException: Unable to get value for field 'someOptionalNumber' of class 'java.lang.Integer']]
...
Caused by: net.sf.jasperreports.engine.JRException: Unable to get value for field 'someOptionalNumber' of class 'java.lang.Integer'
    at net.sf.jasperreports.engine.data.JsonDataSource.getFieldValue(JsonDataSource.java:241)
    at net.sf.jasperreports.engine.fill.JRFillDataset.setOldValues(JRFillDataset.java:1358)
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1259)
    at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1235)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1588)
    at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:149)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:939)
    at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:871)
    at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:114)
    at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
    at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
    at reporting.engine.ReportEngine$.reporting$engine$ReportEngine$$createPDF(ReportEngine.scala:64)
...
Caused by: org.apache.commons.beanutils.ConversionException: Unparseable number: ""
    at org.apache.commons.beanutils.locale.BaseLocaleConverter.convert(BaseLocaleConverter.java:241)
    at org.apache.commons.beanutils.locale.LocaleConvertUtilsBean.convert(LocaleConvertUtilsBean.java:285)
    at net.sf.jasperreports.engine.data.JRAbstractTextDataSource.convertStringValue(JRAbstractTextDataSource.java:70)
    at net.sf.jasperreports.engine.data.JsonDataSource.getFieldValue(JsonDataSource.java:231)
    ... 49 common frames omitted
Caused by: java.text.ParseException: Unparseable number: ""
    at java.text.NumberFormat.parse(NumberFormat.java:385)
    at org.apache.commons.beanutils.locale.converters.DecimalLocaleConverter.parse(DecimalLocaleConverter.java:253)
    at org.apache.commons.beanutils.locale.converters.IntegerLocaleConverter.parse(IntegerLocaleConverter.java:218)
    at org.apache.commons.beanutils.locale.BaseLocaleConverter.convert(BaseLocaleConverter.java:232)

【问题讨论】:

  • 在 jasper 报告中,不能有可选字段。任何一个字段都可以有空值。但不支持可选。
  • 您应该在缺少 JSON 属性的地方看到 null 值。该错误表示引擎在需要一个数字时遇到了一个空字符串。这意味着您的 JSON 可能与该属性不一致。您可能必须修复 JSON 数据才能使其正常工作。
  • 您使用的是什么 JasperReports 版本?该问题可能已由 community.jaspersoft.com/jasperreportsr-library/issues/3742 修复,即在 JasperReports 6.0 或更高版本中。
  • 我用的是5.5.1版本
  • 是的,新版本解决了问题!你可以写答案dada67,我可以为你背书!

标签: json jasper-reports


【解决方案1】:

我使用的是 5.5.1 版本的 JasperReports,升级到最新版本 (6.3.1) 解决了 dada67 建议的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多