2017-04-12 11 views
3

일부 RESTful 웹 서비스를 테스트 할 때 REST-Assured를 사용하고 있습니다. 내가 가져 싶습니다REST-Assured - 값 목록을 가져 오는 JsonPath

{ 
    "status":true, 
    "responseData":{ 
     "orderLevelReasons":[ 
      { 
       "reasons":[ 
        { 
         "reasonId":"129cfea8-b022-4dc8-9811-222a324f46aa", 
         "reasonName":"COD Amount Mismatch" 
        }, 
        { 
         "reasonId":"a881fd5c-626e-438c-8026-646aa2a19098", 
         "reasonName":"Gave wrong information" 
        }, 
        { 
         "reasonId":"543d438a-88cc-487c-86e4-19eecefa9ca7", 
         "reasonName":"Late delivery" 
        }, 
        { 
         "reasonId":"080cd7c1-7a37-48ad-9090-57286d93ea41", 
         "reasonName":"Parcel not received" 
        }, 
        { 
         "reasonId":"5ca3d9b4-0fa2-49da-a534-a6f2e7eccc07", 
         "reasonName":"Staff did not inform about the parcel arrival" 
        } 
       ], 
       "issueName":"ISSUE TYPE 1", 
       "issueId":"0c2c37a6-62b6-4c28-ab6c-566487d045bd", 
       "hint":"" 
      }, 
      { 
       "reasons":[ 
        { 
         "reasonId":"129cfea8-b022-4dc8-9811-222a324f46aa", 
         "reasonName":"COD Amount Mismatch" 
        }, 
        { 
         "reasonId":"14975b5d-23fb-4735-8082-2e02d6335788", 
         "reasonName":"Data issue" 
        }, 
        { 
         "reasonId":"7e6e8446-3774-4589-9171-8e7ab0a7f73b", 
         "reasonName":"Delivery BOY did not inform before delivering" 
        }, 
        { 
         "reasonId":"543d438a-88cc-487c-86e4-19eecefa9ca7", 
         "reasonName":"Late delivery" 
        }, 
        { 
         "reasonId":"080cd7c1-7a37-48ad-9090-57286d93ea41", 
         "reasonName":"Parcel not received" 
        }, 
        { 
         "reasonId":"8e430c71-f28b-49e4-9946-e0bd5131768b", 
         "reasonName":"Refuse to come doorstep" 
        }, 
        { 
         "reasonId":"515d0fa4-a44c-47eb-a7a2-5ddae778f37a", 
         "reasonName":"Extra Amount taken By Partner Staff" 
        } 
       ], 
       "issueName":"ISSUE TYPE 2", 
       "issueId":"ac902377-3db2-462a-8e53-48b06d1aff1f", 
       "hint":"" 
      } 
     ], 
     "productLevelReasons":[ 
      { 
       "reasons":[ 
        { 
         "reasonId":"6129dcb8-1ae5-4d7d-9c95-4c0ec2f69ded", 
         "reasonName":"Some reason1" 
        }, 
        { 
         "reasonId":"febec32b-b243-4509-b46a-20d9f4747ca3", 
         "reasonName":"Some reason2" 
        }, 
        { 
         "reasonId":"d8a492b8-f816-41e6-b45d-5ec29f3a0785", 
         "reasonName":"Some reason3" 
        }, 
        { 
         "reasonId":"c0c98489-6401-455a-9145-f52664d8aff4", 
         "reasonName":"Some reason4" 
        }, 
        { 
         "reasonId":"ef2b4147-ee76-4961-b784-63e848a84167", 
         "reasonName":"Some reason5" 
        }, 
        { 
         "reasonId":"7f4f9657-17b2-407b-aed7-16b221bf3229", 
         "reasonName":"Some reason6" 
        }, 
        { 
         "reasonId":"2aa83be6-60cb-43dc-9273-c41e6047315e", 
         "reasonName":"Others" 
        }, 
        { 
         "reasonId":"c432f563-f835-4710-8055-5ee9e0fe1409", 
         "reasonName":"Some reason7" 
        } 
       ], 
       "orderItemName":"Item1", 
       "orderItemId":961253, 
       "hint":"" 
      } 
     ] 
    }, 
    "message":"OK" 
} 

: responseData.orderLevelReasons 아래에있는 모든 reasonId 값의

  1. 목록 여기 내 JSON입니다.
  2. (다중 orderItemIds위한 productLevelReasons가있을 수 있기 때문에)가 orderItemId 961253이다 responseData.productLevelReasons 미만 reasonId 값 목록.

나는 이것을 꽤 많이 봤는데 JsonPath을 사용하여 달성 할 수 있다는 것을 알았지 만, 각각의 목적에 맞는 JsonPath 표현식이 정확히 무엇인지 알 수 없었습니다.

답변

4

responseData.orderLevelReasons

$.responseData.orderLevelReasons[*].reasons[*].reasonId 

아래의 모든 reasonId 값 목록에서 [*] 당신이 orderLevelReasons 컬렉션에서 모든 항목에서 이유를 원하는 경우 orderLevelReasons 필요합니다. 그렇지 않으면 [0]으로 대체 할 수 있고 별개의 목록을 얻을 수 있습니다 (동일한 이유가 각 orderLevelReasons에 대해 반복된다고 가정 할 경우).

responseData.productLevelReasons 미만 reasonId 값리스트는 orderItemId ( 여러 orderItemIds위한 productLevelReasons가있을 수 있기 때문에) 961,253이다.

$.responseData.productLevelReasons[?(@.orderItemId=='961253')].reasons[*].reasonId 

이도 구별하지 않습니다. 중복 된 이유가있을 수있는 경우 중복을 제거해야합니다.

jsonpath.curiousconcept.com에서 두 JsonPath 표현식의 유효성을 검사했습니다. 둘 다 유효합니다. 그러나 Java 코드 은 어떤 이유로 오류가 발생합니다.

나는 이것을 조사했다. 나머지 보장 된 프레임 워크는 JsonPath를 실제로 구현하지 않고 JSON에 대한 독점적 경로 기반 쿼리 구문을 구현합니다. 불행하게도 그 이름은 똑같지 만 실제로 완전히 다른 표준을 기반으로합니다.

docs page 설명 다음 JsonPath 구현 Groovy의 GPath 구문을 사용하고 이 Jayway의 JsonPath 구현과 혼동되어서는 안된다

하는 것으로.

StackOverflow의 JsonPath 태그는 안심 사양 인 accepted JsonPath 사양과 관련이 있습니다.

내 연구 결과에 따르면 나머지 안정적인 jsonpath 구현은 요구 사항을 지원하지 않는다고 결론 내릴 것입니다.Jayway's one과 같은 구현을 사용해야합니다.

+0

감사합니다. Tom! 'JsonPath' 표현식을 이런 식으로 사용하려고합니다 : List orderLevelReasons = new ArrayList (); orderLevelReasons = jsonPath.getList ("$. responseData.orderLevelReasons [*]. 이유 [*]. reasonId");'그러나 잘못된 JSON 표현식을 제공합니다. –

+0

https://jsonpath.curiousconcept.com/에서 두 가지 JsonPath 표현식을 모두 확인했으며 두 가지 모두 유효하며 예상되는 결과를 반환합니다. 그러나 Java 코드는 어떤 이유로 오류를 발생시킵니다. : –

+0

@AkshayMaldhure - 내 대답에 대한 업데이 트를 참조하십시오 –