空手道:当我想设置值$ .. somewhereInJsonPath我得到的路径不能以结束“(Kar

2019-09-29 01:32发布

我想更新的值somewhereInJsonPath在我的JSON文件中的字段。

我使用这样的: * set myBody $..someWhereInJsonPath = 'AAA' 当我运行测试,我得到: Path must not end with a '.'

但是,当我使用* set myBody $..firstHere.someWhereInJsonPath = 'AAA'这是工作。

我认为,在第一种情况下,我们要更新在$第一个值..,它必须工作压力太大。

澄清:

例如,我们有JSON:

{
  "store": {
    "book": [
      {
        "category": "fiction",
        "author": "Evelyn Waugh",
        "title": "Sword of Honour",
        "something": 12.99
      }
    ],
    "bicycle": {
      "color": "red",
      "price": 19.95
    }
  },
  "expensive": 10
}

当我做:$ .store.book [0] .something = 13是工作。

但是当我做:$ ..东西= 13它不工作。

为什么? 我怎么可以更新呢?

在http://jsonpath.com/当我想找到$ ..事情是找到这个值。 但是,当我在空手道使用$ ..东西它不工作。

与Realted https://stackoverflow.com/questions/54928387/karate-jsonpath-wildcards-didnt-work-or-partly-didnt-work

Answer 1:

其实set命令是不是真的设计JsonPath通配符。 例如$[*].foo$..foo是通配符的示例。 和$[0].foo$.fooresponse.foo是纯JS表达式。

所以,请坚持纯JS表达这样的。 这里以下, set是带有可互换eval要使用动态/变量如它的情况下,更有用* eval response[foo]其中foo是一个字符串。

* def response = { foo: { somePath: 'abc' } }
* eval response.foo.somePath = 'xyz'
* match response == { foo: { somePath: 'xyz' } }

如果你确实需要做“大量”的更新,使用变换函数 :

* def response = [{}, {}]
* def fun = function(x, i){ return { foo: 'bar', index: ~~(i + 1) } }
* def res = karate.map(response, fun)
* match res == [{ foo: 'bar', index: 1 }, { foo: 'bar', index: 2 }]


文章来源: Karate: when I want to set value to $..somewhereInJsonPath I get Path must not end with a '
标签: karate