2014-04-19 2 views
0

csv 데이터 소스를 기반으로하는 jrxml 파일이 있습니다. 하나의 열에는 해당 CSV 파일의 json 문자열이 포함됩니다. 이 동적으로 추가하거나 TAG_AND_VALUES을 증가 할 수 있기 때문에 json으로 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에서 각 caseID의 값을 읽고 싶습니다.

+0

의견, 지침? –

답변

2

JasperReports에 내장 된 JSON 데이터 소스를 사용하여 어떤 작업을 수행 할 수 있습니다. json으로 문자열에서 값을 읽을 수있는 하위 데이터와 목록 구성 요소를 사용 JRXML 조각 아래 참조 :

  1. 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 텍스트를 처리하여 후행 쉼표를 제거해야합니다.

  2. CaseNumber 필드를 숫자/정수로 선언하면 JR에 CaseNumber가없는 레코드가있는 문제가 있습니다. 필드를 문자열로 유지하는 것은 일시적인 해결책이며 필요하면 숫자로 수동으로 구문 분석 할 수 있습니다.
+0

답변을 upvote 가지고 있지만, 어쨌든 나는 이것을 위해 더 나은 해결책을 위해 scriplets를 사용해야합니다. –

관련 문제