当前位置: 首页 > 知识库问答 >
问题:

jasper的Json操作

上官波鸿
2023-03-14

我有基于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_VALUE。

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

共有1个答案

殷耀
2023-03-14

您可以使用内置于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>

此方法存在两个问题:

  1. JSON 不允许使用尾随逗号。如果不控制数据源,则需要对 JSON 文本进行一些处理以删除尾随逗号。
  2. 将“大小写编号”字段声明为数字/整数将不起作用,JR 中存在没有“大小写编号”的记录的问题。将字段保留为字符串是一种解决方法,如果需要,可以手动将其解析为数字。
 类似资料:
  • Jasper报表在从数据库中获取值时是如何工作的。我知道每一行都会重复这个细节带,但我的问题是: 为什么我问这些问题是,我想做一些操作通过所有行的基础上,有一个元素在我的细节带,应该打印或不在每个带。 示例:假设我的DB总是返回两行,一行用于public和一行用于private,并且我必须比较其中的一列,将name写成overall_score,如下所示: 我在detail band上有一个lin

  • 对于Jasper报告4.5 如何访问条形图标签表达式?我尝试过,我们可以通过访问label。但是当这个生成器执行时,它没有我们在jrxml文件中为 字段设置的公式,例如[barvalue$colorcode$]。我发现 是在 类中执行的,该类是JasperReport类。

  • 编码和解码简单数据类型 # json_simple_types.py import json data = [{'a': 'A', 'b': (2, 4), 'c': 3.0}] print('DATA:', repr(data)) data_string = json.dumps(data) print('JSON:', data_string) # json_simple_types_d

  • 我有以下问题。我有一个Writer类,它通过GSON将我创建的所有对象写入JSON文件。输出如下所示: eventID是一个序列化的整数,每次创建新的obj时都使用AtomicInteger创建。 线程“main”com.google.gson.jsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_ARRAY但在第1行第1列路径$

  • Jasper 是在 Raspberry Pi 上开发的自动化的语音控制私人助理工具。 用户可以使用 Jasper 语音命令来完成各种类型的任务,比如读取新闻,读取网络社交的通知,控制家电等等。Jasper 会进行持续监听,所以用户可以在几米外进行声音控制。