【问题标题】:Robotframework - updating value in json dictionary gives error AttributeError: 'list' object has no attribute 'update'Robotframework - 更新 json 字典中的值给出错误 AttributeError: 'list' object has no attribute 'update'
【发布时间】:2017-07-26 01:03:59
【问题描述】:

我有这个 JSON 对象,我喜欢更新对象中的一个值。我找到了一种方法,我应该如何在 stackoverflow (Json handling in ROBOT) 上执行此操作,但它失败了,我不明白为什么。

这是对象:

{"elementKey":"P690-C0-C3-B1","fields":[{"key":"P690-C1-C2-C1-C1-C1-F0","values":[]},{"key":"P690-C0-C2-F8","values":["1200"]},{"key":"P690-C0-C2-F9","values":["22000"]},{"key":"P690-C0-C2-F11","values":["I"]},{"key":"P690-C0-C2-F10","values":["2200"]},{"key":"P690-C0-C2-C0-C0-F0","values":["98-zsg-2"]},{"key":"P690-C1-C0-C0-F1","values":["Personenauto"]},{"key":"P690-C1-C0-C0-F2","values":["Personenauto KVP"]},{"key":"P690-C0-C2-F6","values":["B"]},{"key":"P690-C0-C2-F7","values":["75"]},{"key":"P690-C0-C2-F4","values":["2"]},{"key":"P690-C0-C2-F5","values":["5"]},{"key":"P690-C0-C2-F2","values":["model"]},{"key":"P690-C0-C2-F3","values":["2017"]},{"key":"P690-C1-C2-C2-C2-C1-F0","values":[]},{"key":"P690-C0-C2-F1","values":["merk"]}]}

在给定链接的启发下,我在机器人框架中进行了此测试。

${json_string}=    Set Variable "see text above"
${json}=    Evaluate    json.loads('''${json_string}''')    json
Set To Dictionary    ${json["fields"]} ${new_value} 
${json_string}=    evaluate    json.dumps(${json})    json

使用 ${new_value} 我尝试了 value=shizzleliz, value[0]=shizzleliz, value[1]=shizzleliz, P690-C1-C2-C1-C1-C1-F0=shizzleliz

全部报错:AttributeError: 'list' object has no attribute 'update'

当我将 ${json["fields"]} 更改为 ${json} 时,将给定值设置为库,但不在字段部分/集合中。

有人知道我做错了什么吗?如果您对我如何更新该值有任何建议,我非常希望 :)

目标是改变:{"key":"P690-C1-C2-C1-C1-C1-F0","values":[]} 至:{"key":"P690-C1-C2-C1-C1-C1-F0","values":["shizzleliz"]}

【问题讨论】:

  • 您正在尝试在列表${json["fields"]} 上申请Set To Dictionary
  • 感谢您的遮阳篷,但是当我使用设置列表值时,会添加 shizzleliz。我改变了我的问题,也许你可以在正确的方向上帮助我?

标签: python json robotframework


【解决方案1】:

对于您问题的第一部分 - 错误 AttributeError: 'list' object has no attribute 'update',您已经看到了评论 - 您正在对无法通过的列表对象调用 Set To Dictionary

对于第二部分,为了在键等于某个值时设置该值,您必须遍历所有列表成员,并根据键上的条件进行设置:

${json_string}=    Set Variable     see text above
${json1}=    Evaluate    json.loads('''${json_string}''')    json
${target value}=    Create List    shizzleiz
:FOR    ${element}      IN      @{json1["fields"]}
\   Run Keyword If      "${element['key']}" == "P690-C1-C2-C1-C1-C1-F0"
...     Set To Dictionary  ${element}   values=${target value}

${json_string}=    evaluate    json.dumps(${json1})    json

在RF中看起来有点麻烦(相比python);一句话—​​—将局部变量命名为与模块相同的名称绝不是一个好主意——因此我将其重命名为${json1}

【讨论】:

  • 这不太对。它将值设置为字符串 ("shizzeleliz") 而不是字符串列表 (["shizzeleliz"])
  • 确实是把它设置成一个字符串,对,在问题中错过了;更新以创建一个列表变量并设置为它。
  • 感谢遮阳篷,结果有点不同。但你肯定帮助我朝着正确的方向前进!
【解决方案2】:

我使用Catenate 找到了一个更简单的解决方案,我需要随机化 json 正文中的两个值。

${shizzleiz}=      shizzleiz    # or whatever you want to appear there
${json_string}=   Catenate   {"elementKey":"P690-C0-C3-B1","fields":[{"key":"P690-C1-C2-C1-C1-C1-F0","values":[]},{"key":"P690-C0-C2-F8","values":["1200"]},{"key":"P690-C0-C2-F9","values":["22000"]},{"key":"P690-C0-C2-F11","values":["I"]},{"key":"P690-C0-C2-F10","values":["2200"]},{"key":"P690-C0-C2-C0-C0-F0","values":["98-zsg-2"]},{"key":"P690-C1-C0-C0-F1","values":["Personenauto"]},{"key":"P690-C1-C0-C0-F2","values":["Personenauto KVP"]},{"key":"P690-C0-C2-F6","values":["B"]},{"key":"P690-C0-C2-F7","values":["75"]},{"key":"P690-C0-C2-F4","values":["2"]},{"key":"P690-C0-C2-F5","values":["5"]},{"key":"P690-C0-C2-F2","values":["model"]},{"key":"P690-C0-C2-F3","values":["2017"]},{"key":"P690-C1-C2-C2-C2-C1-F0","values":  ${shizzleiz}  ${the-rest-of-the-long-json-as-a-string}

然后继续:

${json}=    Evaluate    json.loads('''${json_string}''')    json
${json_string}=    evaluate    json.dumps(${json})    json

(基本上在对 json 函数做出反应之前完成工作 - 显然这需要事先知道值,并且还可以处理更多变量。)

【讨论】:

  • 请在“代码行”之前使用四个空格来格式化您的答案,以便于阅读。
猜你喜欢
  • 2022-01-10
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-25
  • 2015-09-26
  • 2021-04-09
相关资源
最近更新 更多