【问题标题】:Unable to delete keys in JSON无法删除 JSON 中的键
【发布时间】:2017-01-18 12:50:53
【问题描述】:

所以我有以下 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["root"] 是一个字典,你用整数索引它!
  • 请注意 output_json 是一个 Python 字典。原始 JSON 文件中的 truefalse 的值现在将是 Python 布尔值 TrueFalse。除了有关引用 dict 值的 cmets(Kasramvd 的答案很棒)之外,请注意您正在使用的数据类型。您的所有项目都将无法通过 == "false" 测试,因为您正在比较布尔值和字符串。

标签: python json python-2.7 python-3.x


【解决方案1】:

首先,output_json["root"] 是一个字典,您使用整数对其进行索引。其次,作为一种更 Pythonic 的方式,您可以更好地迭代您的项目并保留所需的项目:

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)} 

【讨论】:

  • 我想将它们作为 JSON 保存在与原始文件相同的结构中,只是希望不需要的元素消失。我运行了你的代码,但它说:KeyError: 'sampleKey'
  • @SomeAndroidProgrammar,可能不是你所有的子词典都没有
  • @SomeAndroidProgrammar 正如火山所说的 * 可能,并非所有子词典都有它*。
【解决方案2】:

你的根是一个字典而不是一个列表,所以你不能使用整数索引。这是有效的更新代码

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

【讨论】:

  • 永远不要与 False 比较!使用如果不是
  • 不是更好。看在上帝的份上,使用布尔运算符!
  • is False 明确说明了这里的问题。它读取whose sampleKey is false
  • 你让我怀疑你没有完全理解 if 的工作原理。您正在编写冗余代码!
  • Python,使用 not 运算符
【解决方案3】:

其他的可以参考一下。

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

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

【讨论】:

    【解决方案4】:

    尝试改变:

    output_json.pop(output_json[i])  
    

    到:

    output_json.pop(i)
    

    【讨论】:

      猜你喜欢
      • 2020-12-15
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2015-10-27
      • 2016-03-09
      • 2018-11-13
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多