为什么我的json结果包含两个具有相同名称的部分?

时间:2015-09-20 21:01:57

标签: python json simplejson

我使用以下代码从字符串值获取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"]}}

我的代码有什么问题?

1 个答案:

答案 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