繁体   English   中英

如何使用 python 过滤嵌套的 json 文件?

[英]How do i filter nested json file using python?

我正在尝试过滤嵌套的 JSON 文件。 我想创建一个新的 json 文件,其中包含“类”和“id”。 源 JSON 文件:

[
{"data": {"id": "ed", "label": "Executive Director (Harriet)"},
 "classes": "purple"  
 },

{"data": {"id": "vp1", "label": "Vice President (Sarah)"},
 "classes": "square"  
 },

{"data": {"id": "vp2", "label": "Vice President (Charlotte)"},
 "classes": "square"  
 },

{"data": {"id": "po1", "label": "Program Officer (Sojourner)"},
 "classes": "green diamond"  
 },

 {"data": {"id": "po2", "label": "Program Officer (Sojourner)"},
 "classes": "green diamond"  
 },
{"data": {"id": "pa", "label": "Program Associate (Ellen)"},
 "classes": "myimage"  
 }
 ]

我的目标是过滤'classes': 'green diamond'具有'id': 'po1' 然后删除所有带有 'green diamond' 的类,除了'id': 'po1'

结果:

[
{"data": {"id": "ed", "label": "Executive Director (Harriet)"},
 "classes": "purple"  
 },

{"data": {"id": "vp1", "label": "Vice President (Sarah)"},
 "classes": "square"  
 },

{"data": {"id": "vp2", "label": "Vice President (Charlotte)"},
 "classes": "square"  
 },

{"data": {"id": "po1", "label": "Program Officer (Sojourner)"},
 "classes": "green diamond"  
 },


{"data": {"id": "pa", "label": "Program Associate (Ellen)"},
 "classes": "myimage"  
 }]

我尝试使用此代码来获取数据,但它引发了错误:

import json

# Loding the data
with open("D:/bb.json", 'r') as file:
    content = file.read()

# Converting json_data to python dictionary format
json_data = json.loads(content)

quantite = -1  # -1 for not found case
for data in json_data[0]:

    # Checking for specific pair
    if data['classes'] == 'square' and data['id'] == 'vp2':
        print(data)
        break

我如何过滤这样的 json 文件?

由于加载的json数据只是嵌套的lists和dicts,可以使用普通的list/dict操作; 特别是,列表推导很有用。

import json

with open('input', 'r') as f:
    data = json.loads(f.read())

filtered = [x for x in data if not (x['classes'] == 'green diamond' and x['data']['id'] != 'po1')]

with open('output', 'w') as f:
    f.write(json.dumps(filtered, indent=2))

结果:

[
  {
    "data": {
      "id": "ed",
      "label": "Executive Director (Harriet)"
    },
    "classes": "purple"
  },
  {
    "data": {
      "id": "vp1",
      "label": "Vice President (Sarah)"
    },
    "classes": "square"
  },
  {
    "data": {
      "id": "vp2",
      "label": "Vice President (Charlotte)"
    },
    "classes": "square"
  },
  {
    "data": {
      "id": "po1",
      "label": "Program Officer (Sojourner)"
    },
    "classes": "green diamond"
  },
  {
    "data": {
      "id": "pa",
      "label": "Program Associate (Ellen)"
    },
    "classes": "myimage"
  }
]

尝试以下,对您的代码进行了一些更新

import json
# Loding the data
pathToFile = "bb.json"
with open(pathToFile, 'r') as file:
    content = file.read()
# Converting json_data to python dictionary format
json_data = json.loads(content)

removeEntryClass = "green diamond"
keepId = "po1"
outputList = []

for entry in json_data:
    if entry["classes"] == removeEntryClass and entry["data"]['id'] != keepId :
        continue
    outputList.append(entry)

print(outputList)
#You can save this list into jour file.. 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM