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

问题描述 投票:0回答:2

我正在使用 REST-Assured 来测试一些 RESTful Web 服务。这是我的 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
    下,其中
    orderItemId
    961253
    (因为多个
    orderItemIds
    可能存在产品级别原因)。

我在 Google 上搜索了很多,发现这可以使用

JsonPath
来实现,但我无法弄清楚我的每个目的的 JsonPath 表达式到底是什么。

java jsonpath rest-assured rest-assured-jsonpath
2个回答
8
投票

responseData.orderLevelReasons 下所有 ReasonId 值的列表

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

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

responseData.productLevelReasons 下所有 ReasonId 值的列表 其中 orderItemId 为 961253(因为可能存在 ProductLevelReasons 多个 orderItemId)。

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

这也没有区别。如果可能存在重复原因,您需要进行重复数据删除。

我验证了您的两个 JsonPath 表达式 jsonpath.curiousconcept.com,两者均有效。但是Java代码 由于某种原因给出错误。

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

文档页面解释:

请注意,JsonPath 实现使用 Groovy 的 GPath 语法,并且 不要与 Jayway 的 JsonPath 实现混淆。

StackOverflow 上的 JsonPath 标签与

accepted JsonPath 规范有关,而不是放心规范。

根据我的研究,我得出的结论是,放心的 jsonpath 实现不支持您的要求。您应该使用这样的实现,例如

Jayway 的一个


0
投票
嗨,如果你不想使用常规路径,你可以使用 JsonPath.getList("path") 获取数据

JsonPath.getList("responseData.orderLevelReasons.reasons.reasonId");

enter image description here

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.