2017-05-06 14 views
0

異なるjsonペイロードでAccountNoフィールドの値を検索する必要があります。 AccountNoはjsonペイロードのどのレベルにも存在できます。 AccountNoが存在するかどうかを確認し、ロガーで値を印刷する必要があります。JSONハッシュマップで特定のデータを検索

私は以下のものをより豊富に使用していますが、AccountNoキーがどこにも存在するかどうかを確認して値を取得するために、ハッシュマップを繰り返していきたいと考えています。

また、json自体を解析する他の方法があるかどうかをご提案ください。 xpathでは "// AccountNo"はxml文書全体のAccountNoを検索します。私は何かの後に似ています。

<enricher target="#[flowVars.myJsonMap]" doc:name="Message Enricher"> <json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/> </enricher> <logger message="#[flowVars.myJsonMap.employees[0].AccountNo]" level="INFO" doc:name="Logger"/> </flow>

そのハッシュマップ

ので例のJSONペイロードの下

{ 
"Account": { 
"AccountName": "John", 
"AccountNo": "4234324" 
} 
} 

{ 
"Order": { 
"OrderId": "34234242", 
"ServiceOrder": [ 
    { 
    "AccountNo": "231232", 
    "ServiceOrderId": "54654698787" 
    }, 
    { 
    "AccountNo": "231232", 
    "ServiceOrderId": "78979879797" 
    } 
    ] 
    } 

答えて

0

を見つけてください、あなたは値を取得するためにyourmap.get(keyvalue)を使用することができます。

あなたの質問から
<logger message="#[flowVars.myJsonMap.yourkey?]" level="INFO" doc:name="Logger"/> 
+0

この場合、私のキーが入れ子になる場所はわかりません。上記のサンプルペイロードは、元のコメントで見つけてください。 – user3366906

0

、私は、次の前提としています

  • あなたのペイロードは、ネストされたマップとリストの他のオブジェクトと一緒に含まれているあなたのペイロードの任意のレベルで存在しているかもしれ
  • AccountNo

Groovyトランスフォーマーを使用してペイロードを再帰的に解析し、List内の既存のAccountNoをすべて収集できます。

//recursively parse any Map or List in myObject 
//and store AccountNo objects accountNoList 
def parseObject(myObject, accountNoList) { 
    if (myObject instanceof java.util.Map) { 
    //if Map, check for AccountNo field 
    if(myObject.AccountNo != null){ 
     accountNoList.add(myObject.AccountNo) 
    } 

    //seek for more AccountNo in Map 
    for(e in myObject) { 
     parseObject(e.value, accountNoList) 
    } 
    } else if (myObject instanceof java.lang.Iterable) { 
    //if Iterable, parse each values 
    for (value in myObject) { 
     parseObject(value, accountNoList) 
    } 
    } 
} 

myJsonPayload = message.getInvocationProperty('myJsonPayload') 
myAccountNoList = [] //init an empty list which will be filled 
parseObject(myJsonPayload, myAccountNoList) 
return myAccountNoList 

次に、単にロガーを使用します。

+0

javaを使って同じことをすることはできますか? – user3366906

0

JSONToXMLTransformerを使用してjsonをXMlに変換した後、XPATHを使用してドキュメント内のどこかのデータを探します。このようにして、jsonファイルを解析するための追加コードを書くことを避けることができます。

+0

入れ子のjsonタグjsonとxmlトランスフォーマでは、完全なペイロードは返されません。 – user3366906

+0

「アカウント」タグが繰り返されるjsonペイロードを提供してもよろしいですか?私は過去にdataweaveを使ってjsonを再帰的に解析するために何かをしました。あなたのペイロードに同じコードが機能しているかどうかを確認します。 –

+0

上記の元のコメントにサンプルのペイロードを追加しました。ありがとう。 – user3366906

関連する問題