REST-Assured - 用于获取值列表的 JsonPath

REST-Assured - JsonPath for fetching a list of values

我正在使用 REST-Assured 来测试一些 RESTful 网络服务。这是我的 JSON:

{
    "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"
}

我要获取:

  1. 所有 reasonId 值的列表 responseData.orderLevelReasons.
  2. 所有 reasonId 值的列表 在 responseData.productLevelReasons 下,其中 orderItemId961253(因为多个 orderItemIds 可能有 productLevelReasons)。

我在谷歌上搜索了很多,发现可以使用 JsonPath 来实现,但我无法弄清楚每个目的的 JsonPath 表达式到底是什么。

A list of all reasonId values under responseData.orderLevelReasons

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

如果您需要 orderLevelReasons 集合中所有项目的原因,则 orderLevelReasons 的 [*] 是必需的。如果不是,您可以用 [0] 替换它,您可以获得一个不同的列表(假设每个 orderLevelReasons 重复相同的原因)。

A list of all reasonId values under responseData.productLevelReasons where orderItemId is 961253 (as there could be productLevelReasons for multiple orderItemIds).

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

这也是分不清的。如果存在重复原因,您需要删除重复数据。

I validated both of your JsonPath expressions at jsonpath.curiousconcept.com, both of them are valid. But the Java code gives error for some reason.

我已经调查过了。放心的框架实际上并没有实现JsonPath,而是JSON的一个专有的基于路径的查询语法。不幸的是,名称相同,但实际上是基于完全不同的标准。

docs page说明:

Note that the JsonPath implementation uses Groovy's GPath syntax and is not to be confused with Jayway's JsonPath implementation.

Whosebug 上的 JsonPath 标签与 accepted JsonPath 规范有关,而不是放心规范。

根据我的研究,我会得出结论,放心的 jsonpath 实现不支持您的要求。您应该使用一个实现,例如 Jayway's one.