2016-04-12 41 views
1

Apache Valocityテンプレートを使用してxmlに変換するjson応答があります。私のJSONはこの形式になります。Apache Velocityテンプレートを使用したJsonマッピング

{ 
    "value": { 
     "1234": { 
      "7": ["abcde"], 
      "2": ["abcde", "lkisy", "skjsk"], 
      "1": ["aksdja", "msnd", "knsda"] 
     }, 
     "7654": { 
      "8": ["NA"], 
      "4": ["NA"], 
      "7": ["BA"] 
     }, 
     "0987": { 
      "8": ["PO"], 
      "3": ["LO"], 
      "2": ["KI"] 
     } 

    } 
} 

マイVelocityテンプレートは、この形式になります。

<VelocityResponse xmlns="xsd location namespace"> 
<HeaderID>${headers.HeaderID}</HeaderID> 
<FirstTag> 
#foreach($body in ${body.value}) 
<SecondTag> 
#set($keys = $body.keySet()) 
#foreach($key in $keys) 
<ThirdTag>$key</ThirdTag> 
#set($someValue = $key.keySet()) 
#foreach($value in $someValue) 
<FourthTag>$value</FourthTag> 
<FifthTag> 
#foreach($userInfo in $someValue[$value]) 
<SixthTag>$userInfo</SixthTag> 
#end 
</FifthTag> 
#end 
</SecondTag> 
#end 
</FirstTag> 
</VelocityResponse> 

私はこれをマップしようとすると、私はこのエラーを受け取る:

198 - org.apache.camel.camel-core - 2.15.1.redhat-621084 | Error : org.apache.velocity.exception.ParseErrorException: Encountered "<EOF>" at org.apache.camel.component.velocity.VelocityEndpoint[line 21, column 27] 
n | Was expecting one of: 
n |  "(" ... 
n |  <RPAREN> ... 
n |  <ESCAPE_DIRECTIVE> ... 
n |  <SET_DIRECTIVE> ... 
n |  "##" ... 
n |  "\\\\" ... 
n |  "\\" ... 
n |  <TEXT> ... 
n |  "*#" ... 
n |  "*#" ... 
n |  "]]#" ... 
n |  <STRING_LITERAL> ... 
n |  <END> ... 
n |  <IF_DIRECTIVE> ... 
n |  <INTEGER_LITERAL> ... 
n |  <FLOATING_POINT_LITERAL> ... 
n |  <WORD> ... 
n |  <BRACKETED_WORD> ... 
n |  <IDENTIFIER> ... 
n |  <DOT> ... 
n |  "{" ... 
n |  "}" ... 
n |  <EMPTY_INDEX> ... 
n |  

は、任意のガットアイデア?

+0

速度テンプレートで使用されるすべての変数が速度モデルにも含まれているかどうかを確認してください。わからない、最初のforeachで正しいです、 "$ {body.value}"。 bodyがモデル内にある場合は、$ body.getValue()のようなgetterを使ってテンプレートにアクセスしてみてください。 – dumitru

+0

こんにちは、実際に値を取得しています。 –

答えて

0

おそらくタイプミスだと思いますが、#endがありません。 (thirdtag上のforeach) は、このテンプレートを使用して試してみてください:

<VelocityResponse xmlns="xsd location namespace"> 
    <HeaderID>${headers.HeaderID}</HeaderID> 
    <FirstTag> 
     #foreach($body in ${body.value}) 
     <SecondTag> 
      #set($keys = $body.keySet()) 
      #foreach($key in $keys) 
       <ThirdTag>$key</ThirdTag> 
      #end 
      #set($someValue = $key.keySet()) 
      #foreach($value in $someValue) 
      <FourthTag>$value</FourthTag> 
      <FifthTag> 
       #foreach($userInfo in $someValue[$value]) 
       <SixthTag>$userInfo</SixthTag> 
       #end 
      </FifthTag> 
      #end 
     </SecondTag> 
     #end 
    </FirstTag> 
</VelocityResponse> 
+0

欠けている「#end」タグを指摘してくれてありがとう、それはタイプミスでした。 ThirdTagをマッピングした後に2番目のforeachブロックが終了しないと思っていませんか? –

+0

あなたのビジネスロジックによって異なります。あなたはあなたが望むあなたの成果を基に決定します。その答えが役に立った場合は、それを有用なものとしてマークしてください。 – dumitru

0

だから、頭がしばらく襲撃後。

<VelocityResponse xmlns="xsd location namespace"> 
<HeaderID>${headers.HeaderID}</HeaderID> 
<FirstTag> 
#foreach($body in ${body.value}) 
#set($keys = $body.keySet()) 
#foreach($key in $keys) 
<SecondTag> 
<ThirdTag>$key</ThirdTag> 
<NewTag> 
#set($somevalue = $body[$key].keySet()) 
#foreach($input in $somevalue) 
<FourthTag>$input</FourthTag> 
<FifthTag> 
#foreach($userInfo in $body[$key][$input]) 
<SixthTag>$userInfo</SixthTag> 
#end 
</FifthTag> 
#end 
</NewTag> 
</SecondTag> 
#end 
#end 
</FirstTag> 
</VelocityResponse>