Search code examples
jsonjasper-reports

Optional fields from JSON datasource JasperReports


I'm using JSON data source for creating report in JasperReport. Inside iReport field is declared as Integer. This field is used in row among other fields.

Input JSON example:

[{
    "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 declaration:

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

Problem is that in input JSON someOptionalNumber is optional and as such doesn't exists in every row. Can field be optional ?

When I run such JSON i get this error:

Caused by: net.sf.jasperreports.engine.JRException: Unable to get value for field 'someOptionalNumber' of class 'java.lang.Integer'

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)

Solution

  • I was using 5.5.1 version of JasperReports, upgrade to latest version (6.3.1) solved issue as dada67 sugested