空手道:当我想将值设置为$ .. somewhereInJsonPath时,我得到Path不能以'结尾

时间:2019-02-28 12:16:55

标签: karate

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

我为此使用* 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它正在工作。

但是,当我这样做时:$ .. something = 13它不起作用。

为什么?我该如何更新呢?

http://jsonpath.com/,当我想查找$ .. something时,找到该值。但是当我在空手道中使用$ .. something时,它将无法正常工作。

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

1 个答案:

答案 0 :(得分:1)

实际上,set命令并不是真正为JsonPath通配符设计的。例如,$[*].foo$..foo是通配符的示例。 $[0].foo$.fooresponse.foo是纯JS表达式。

因此,请坚持使用这种纯JS表达式。在下面的情况下,seteval可以互换,如果您想将动态/变量用于例如* eval response[foo],其中foo是字符串。

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

如果确实需要“批量”更新,请使用transform function

* 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 }]