【问题标题】:Check the json comparison without index hardcoding? [closed]检查没有索引硬编码的json比较? [关闭]
【发布时间】:2020-12-25 12:14:36
【问题描述】:

我有一个 JSON,其中包含在许多 JSON 索引下重复的特定键。如果键值与我的值匹配,我应该检查所有索引。我怎样才能在它的robotframework或python中实现?

JSON:

 ${Getjson}=    [ { "ID": "100", "name": "john" }, { "ID": "101", "name": "jack" }, { "ID": "102", "name": "jim" } ]
 

这些 JSON 每次索引时都会更改其名称

 [ { "ID": "100", "name": "john" }, { "ID": "101", "name": "jim" }, { "ID": "102", "name": "jack" } ]

我的机器人代码:

  should be equal    jack   ${Getjson[1]['name']}   msg=Name is not matching.   values=False

如果 JSON 中的索引发生更改,则此代码每次都会失败。

如果等于使用机器人框架或python,我如何引入for循环来检查所有索引和匹配?

【问题讨论】:

  • 如果您知道指数会发生变化,这种测试的目的是什么?
  • JSON 每次索引都会改变,所以我需要验证值是否匹配
  • 我不明白您希望匹配哪些值以及“每次索引”的含义。而且您显示的代码甚至不是有效的 json。
  • 我的意思是名称的值正在从第 0 个索引更改为第 1 个索引并返回。所以我已经手动给出 [1] 硬编码,但我正在尝试使用 for 循环并检查所有索引。
  • @yedpodtrzitko,哎呀!抱歉,我粘贴了错误的 JSON,现在我已经更改了它,请您指导我如何使用 python 代码检查所有键

标签: python json robotframework


【解决方案1】:

机器人框架的JSONLibrary中有过滤器?(@.filtercondition)可以使用。请注意,如果多次匹配过滤条件,它将始终返回值列表。并且 Jsonpath 不接受空格,并且条件操作数应该用单引号括起来。

${json}=      Convert String to JSON    ${Getjson}
${name}=      Get Value From Json         ${json}        $[?(@.name='john')].name 
# should be equal     john     ${name}[0]
List Should Contain Value   ${name}     john      // use this if you don't want to
...   rely on index. In case of empty list both keyword will assert to fail.

如果jsonpath中给定条件的json中有多个匹配节点,也不能保证它会匹配预期条件

【讨论】:

  • 但是你为什么在这里硬编码 $[?(@.name='john')].name john 呢?我应该只检查 json 键是否具有所需的值
  • 我通过 $[?(@.name)].name 添加了这个
  • 是的,它是正确的。我只会给出那个。但有问题的参考是名称值,所以添加了过滤器
  • 就是迭代数组的每个节点,其中name=='John',表达式中?是过滤条件表达式的标识符,@是指向数组的当前节点
  • 使用 $.data[?(@.name)]
猜你喜欢
  • 1970-01-01
  • 2016-07-08
  • 2013-09-18
  • 2021-06-07
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2019-09-27
  • 2011-06-19
相关资源
最近更新 更多