Python 无法删除JSON中的键

Python 无法删除JSON中的键,python,json,python-2.7,python-3.x,Python,Json,Python 2.7,Python 3.x,因此,我有以下JSON: { "root" : { "111111" : { "sampleKey" : true }, "222222" : { "sampleKey" : false }, "333333" : { "sampleKey" : true }, "444444" : { "sampleKey" : false } } } 我试图删除sampleKey为fal

因此,我有以下JSON:

{
  "root" : {
    "111111" : {
      "sampleKey" : true
    },
    "222222" : {
      "sampleKey" : false
    },
    "333333" : {
      "sampleKey" : true
    },
    "444444" : {
      "sampleKey" : false
    }
  }
}
我试图删除sampleKeyfalse的任何元素,然后保存更新后的JSON文件,但我的代码不起作用,我试图找出我做错了什么:

import json

output_file = open('input_file.json').read()
output_json = json.loads(output_file)

for i in xrange(len(output_json["root"])):
    if(output_json["root"][i]["signedUp"] == "false"):
        output_json.pop(output_json[i])
        break

open("updated-file.json", "w").write(json.dumps(obj, sort_keys=True, indent=4, separators=(',', ': '))
)
有人能帮我改变一下吗

output_json.pop(output_json[i])  
致:


首先,
output\u json[“root”]
是一个字典,您使用整数对它进行索引。其次,作为一种更具python风格的方式,您最好迭代您的项目,并保留所需的项目:

new_dict = {key: value for key, value in output_json["root"].items() if value['sampleKey']}
如果所有项目都没有
sampleKey
,则可以使用
dict.get()
而不是直接索引

new_dict = {key: value for key, value in output_json["root"].items() 
            if value.get('sampleKey', True)} 

您的根是一个dict而不是一个列表,因此您不能使用整数索引。下面是有效的更新代码

import json

output_json = json.load(open('input_file.json'))
for key in output_json["users"].keys():
    if(not output_json["users"][key].get("signedUp",True)):
        print "deleting",key
        del(output_json["users"][key])

json.dump(output_json,open('updated-file.json','w'))

PS:在您的示例中,您遇到的是
sampleKey
,而不是
signedUp

另一个可能您可以参考它

output_json['root'] = {x: output_json['root'][x] for x in output_json['root'] if output_json['root'][x]['sampleKey']}

我认为这比你的方法简单。

output\u json[“root”]
是一个字典,你正在用整数索引它!请注意,输出_json是Python指令。原始json文件中的
true
false
值现在将是Python布尔值
true
false
。除了关于引用dict值的注释(Kasramvd的答案很好),还要注意所使用的数据类型。您的所有项目都将无法通过
==“false”
测试,因为您正在比较布尔值和字符串。我希望将它们作为JSON保留在与原始文件相同的结构中,只希望不需要的元素消失。我运行了你的代码,但它说:
keyrerror:'sampleKey'
@SomeAndroidProgrammar,可能不是所有的子字典都有ot@SomeAndroidProgrammar正如火山所说,可能不是所有的子字典都有。千万不要和False相比!如果不是更好的话就使用。看在上帝的份上,使用布尔运算符
为False
明确了此处的问题。它读的是
谁的sampleKey是false
你让我怀疑你不完全理解if是如何工作的。你在写多余的代码!Python,使用not运算符
output_json['root'] = {x: output_json['root'][x] for x in output_json['root'] if output_json['root'][x]['sampleKey']}