2017-05-06 9 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 변환기를 사용하여 페이로드를 재귀 적으로 구문 분석하고 목록의 기존 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