I have json object like this
{
"data":[
{
"no":1,
"name" : "yuda",
"address" : "surabaya"
},
{
"no":2,
"name":"adi",
"address":"jakarta"
}
],
"comp_name":"TEST CORP",
"title":"Company employee",
"status":"success"
}
I serve that json with http rest API and I want to create report with jasper report and I have success if I pass it as an url JsonQueryExecuterFactory.JSON_SOURCE
.
My problem is that I can't include session cookie in JSON_SOURCE
, the solution I'm trying is to create a http request in java code and then include it with JsonQueryExecuterFactory.JSON_INPUT_STREAM
, but it's not working, it just shows blank page. Even though I update parameter from $P{net.sf.jasperreports.json.source}
to $P{JSON_INPUT_STREAM}
it doesn't work.
This is a full example of loading your json from a http request via java (you can add headers as you like), using a subreport to pass the
data
node as asubDataSource
Example URL: http://www.jdd.it/so/jsonTest.json *Your json is available on this url
Main report (jsonMain.jrxml)
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="JsonMain" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="15289120-bdf0-4edd-905c-647999c3c0cc">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="json"/>
<parameter name="SUBREPORT_DIR" class="java.lang.String" isForPrompting="false">
<defaultValueExpression><![CDATA["C:\\jdd\\..path..to..subreport\\"]]></defaultValueExpression>
</parameter>
<queryString language="JSON">
<![CDATA[]]>
</queryString>
<field name="comp_name" class="java.lang.String">
<fieldDescription><![CDATA[comp_name]]></fieldDescription>
</field>
<field name="title" class="java.lang.String">
<fieldDescription><![CDATA[title]]></fieldDescription>
</field>
<field name="status" class="java.lang.String">
<fieldDescription><![CDATA[status]]></fieldDescription>
</field>
<detail>
<band height="40">
<staticText>
<reportElement x="0" y="0" width="115" height="20" uuid="023be3f7-66fc-4718-9ca3-220c16ddc97a"/>
<textElement verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<text><![CDATA[Company name:]]></text>
</staticText>
<textField>
<reportElement x="115" y="0" width="103" height="20" uuid="15aadf03-03a1-4c05-8bf9-cdf7db09153c"/>
<textElement verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{comp_name}]]></textFieldExpression>
</textField>
<subreport>
<reportElement x="0" y="20" width="555" height="20" uuid="c8251ce1-5de4-476f-a4cc-89717d422cc7"/>
<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("data")]]></dataSourceExpression>
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "jsonMain_subreport.jasper"]]></subreportExpression>
</subreport>
<staticText>
<reportElement x="218" y="0" width="39" height="20" uuid="4c8d8333-117a-4447-98ac-bfebbd28776a"/>
<textElement verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<text><![CDATA[Title:]]></text>
</staticText>
<textField>
<reportElement x="257" y="0" width="154" height="20" uuid="0f266993-1bf3-41cf-8db6-c8b5aaccef74"/>
<textElement verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{title}]]></textFieldExpression>
</textField>
<staticText>
<reportElement x="411" y="0" width="51" height="20" uuid="9afd4de9-5155-43a6-ae63-337bb77deac8"/>
<textElement verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<text><![CDATA[Status:]]></text>
</staticText>
<textField>
<reportElement x="462" y="0" width="93" height="20" uuid="6e8ab3b0-c8eb-40f4-ade8-9dd60e34a721"/>
<textElement verticalAlignment="Middle">
<font size="14" isBold="true"/>
</textElement>
<textFieldExpression><![CDATA[$F{status}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
The key is to
subDataSource
thedata
node((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("data")
and pass this to subreport
Subreport (jsonMain_subreport.jrxml)
<?xml version="1.0" encoding="UTF-8"?>
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="jsonMain_subreport" language="java" pageWidth="555" pageHeight="802" columnWidth="555" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" uuid="9c681432-4547-4fd8-91c1-5634ca368da6">
<field name="no" class="java.lang.String"/>
<field name="name" class="java.lang.String"/>
<field name="address" class="java.lang.String"/>
<columnHeader>
<band height="20" splitType="Stretch">
<staticText>
<reportElement mode="Opaque" x="0" y="0" width="100" height="20" backcolor="#CCCCCC" uuid="3dbc394e-6a5a-45d2-8d53-c9880f3974e7"/>
<box leftPadding="2" rightPadding="2">
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<text><![CDATA[No]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="100" y="0" width="167" height="20" backcolor="#CCCCCC" uuid="2c40967a-42d5-439e-a1c3-5d41fd50f906"/>
<box leftPadding="2" rightPadding="2">
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<text><![CDATA[Name]]></text>
</staticText>
<staticText>
<reportElement mode="Opaque" x="267" y="0" width="288" height="20" backcolor="#CCCCCC" uuid="0d72063d-6354-4e8d-9f89-52d00d100d3e"/>
<box leftPadding="2" rightPadding="2">
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<text><![CDATA[Address]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="20" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="100" height="20" uuid="e9cc4829-5e9a-4747-a594-489b6230713c"/>
<box leftPadding="2" rightPadding="2">
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{no}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="167" height="20" uuid="1c02f144-1c6c-4704-9bfb-13ac39007841"/>
<box leftPadding="2" rightPadding="2">
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="267" y="0" width="288" height="20" uuid="e0b9aff3-c8e3-4895-90a2-339ffb7c856f"/>
<box leftPadding="2" rightPadding="2">
<pen lineWidth="0.25"/>
<topPen lineWidth="0.25"/>
<leftPen lineWidth="0.25"/>
<bottomPen lineWidth="0.25"/>
<rightPen lineWidth="0.25"/>
</box>
<textElement verticalAlignment="Middle"/>
<textFieldExpression><![CDATA[$F{address}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Nothing special in this report, the fields corresponds to the fields in your
data
node, remember to compile subreport to.jasper
before running java code, since.jasper
is indicated in main report.
Java code
//Get our main report
JasperReport report = JasperCompileManager.compileReport("jsonMain.jrxml");
//Open url connection
URLConnection urlConn = new URL("http://www.jdd.it/so/jsonTest.json").openConnection();
//set some cookies
urlConn.setRequestProperty("Cookie", "cookie1=hello; cookie2=world");
//Get the stream
try (InputStream is =urlConn.getInputStream()) {
Map<String, Object> parametersMap = new HashMap<>();
//Pass to parameter map
parametersMap.put(JsonQueryExecuterFactory.JSON_INPUT_STREAM, is);
//Fill report
JasperPrint jasperPrint = JasperFillManager.fillReport(report, parametersMap);
//Export to pdf
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput("json.pdf"));
SimplePdfExporterConfiguration configuration = new SimplePdfExporterConfiguration();
configuration.setMetadataAuthor("Me");
exporter.setConfiguration(configuration);
exporter.exportReport();
}