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

Why my json result contains two sections with the same name?

我使用以下代码从字符串值中获取 json,更新它并将 return 返回为字符串(使用 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。如果我第 3 次 运行 函数,则会更新第一个值(没有像我预期的那样添加)。

预期输出应该是:

{"4": {"values": ["test1", "test2", "test3"]}}

我的代码有什么问题?

如果您在第一次通过时有以下 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 的定义:

pair

string : value