簡體   English   中英

Robotframework - 更新 json 字典中的值給出錯誤 AttributeError: 'list' object has no attribute 'update'

[英]Robotframework - updating value in json dictionary gives error AttributeError: 'list' object has no attribute 'update'

我有這個 JSON 對象,我喜歡更新對象中的值。 我找到了一種方法,我應該如何在 stackoverflow( 機器人中的 Json 處理)上做到這一點,但它失敗了,我不明白為什么。

這是 de 對象:

{"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"]}]}

在 Robot 框架中,我根據給定的鏈接進行了此測試。

${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"]}

對於您問題的第一部分 - 錯誤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}

我使用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 函數做出反應之前先完成工作 - 顯然這需要事先知道值,並且還可以使用更多變量。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM