我使用以下代码从字符串值获取json,更新它并返回字符串(simplejson
使用):
if text:
qj = json.loads(text)
else:
qj = json.loads('{}')
if not qj.get(counter):
qj[counter] = {}
if not qj.get(counter).get('values'):
qj[counter]['values'] = []
if not value in qj[counter]['values']: # avoid duplicates
qj[counter]['values'].append(value)
text = json.dumps(qj)
如果我多次运行具有相同counter
值的函数(在下面的示例中为4
),为什么会得到以下结果:
{"4": {"values": ["test1"]}, "4": {"values": ["test2"]}}
创建的4
部分的数量始终为2.如果我第三次运行该函数,则会更新第一个值(未按预期添加)。
期望输出应为:
{"4": {"values": ["test1", "test2", "test3"]}}
我的代码有什么问题?
答案 0 :(得分:3)
如果在第一次传球中你有以下json:
{4: {"values": ["test1"]}}
text = json.dumps(qj)
之后您将拥有此字符串:
'{"4": {"values": ["test1"]}}'
现在,在使用qj = json.loads(text)
加载json时,您会收到:
{'4': {'values': ['test1']}} # 4 has turned to '4'!
检查4
是否已存在,因为它是一个数字而失败。
因此,为了解决您的问题,您可以在测试期间将计数器简单地转换为字符串:
if not qj.get(str(counter)):
...
这种行为的原因是json不允许整数作为键,请参阅JSON documentation中对的定义:
一对
string:value