首页 文章

Json用jasper操纵

提问于
浏览
0

我有基于csv数据源的jrxml文件 . 该csv文件中只有一列包含json字符串 .

考虑以下样本,

ID  NAME    TAG_AND_VALUES
    1   test1   { "caseID" : "1200", "CaseNumber"  : 12 }
    2   test2   { "caseID" : "1201" }
    3   test3   { "caseID" : "1202", "CaseNumber"  : 14 }
    4   test4   { "caseID" : "1203", "CaseNumber"  : 15 }
    5   test5   { "CaseNumber"  : 16, "caseID" : "1204",  }
    6   test6   { "caseID" : "1205", }

请注意,CaseID始终存在,但无法保证TAG_AND_VALUES的顺序,因为可以动态添加或增加TAG_AND_VALUES .

我想从每个TAG_AND_VALUES中读取每个caseID的值 .

1 回答

  • 2

    您可以使用JasperReports中内置的JSON数据源执行某些操作 . 请参阅下面的JRXML片段,它们使用带有子数据集的列表组件来读取JSON字符串中的值:

    <subDataset name="TagAndValues">
        <field name="caseID" class="java.lang.String"/>
        <field name="CaseNumber" class="java.lang.String"/>
    </subDataset>
    ....
            <componentElement>
                <reportElement x="200" y="0" width="200" height="20" uuid="a6cc346e-d517-431e-8860-d81cc4e1145f"/>
                <c:list xmlns:c="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="TagAndValues" uuid="b8180534-701e-4f9a-ad5f-785d1a5fb74b">
                        <dataSourceExpression>new net.sf.jasperreports.engine.data.JsonDataSource(new java.io.ByteArrayInputStream($F{TAG_AND_VALUES}.getBytes()))</dataSourceExpression>
                    </datasetRun>
                    <c:listContents height="20">
                        <frame>
                            <reportElement x="0" y="0" width="200" height="20" uuid="28b3ebcb-1bd3-422d-9468-54216206315d"/>
                            <textField>
                                <reportElement x="0" y="0" width="100" height="20" uuid="2fba17f5-4547-4f51-a12f-815c7f0589ca"/>
                                <textFieldExpression><![CDATA[$F{caseID}]]></textFieldExpression>
                            </textField>
                            <textField>
                                <reportElement x="100" y="0" width="100" height="20" uuid="2fba17f5-4547-4f51-a12f-815c7f0589ca"/>
                                <textFieldExpression><![CDATA[$F{CaseNumber}]]></textFieldExpression>
                            </textField>
                        </frame>
                    </c:listContents>
                </c:list>
            </componentElement>
    

    这种方法有两个问题:

    • JSON没有控制数据的来源,需要对JSON文本进行一些处理以删除尾随逗号 .

    • 将CaseNumber字段声明为数字/整数赢得了't work, there'在JR中的问题,其中包含没有CaseNumber的记录 . 将字段保持为字符串是一种解决方法,如果需要,可以手动将其解析为数字 .

相关问题