【问题标题】:Delete unnecessary elements in json删除json中不必要的元素
【发布时间】:2021-09-23 05:44:27
【问题描述】:

我有 JSON 数据,我想在其中删除不必要的元素。我正在使用element.pop(),这很正常。但我想知道 JSON 中是否有数千个元素,而我的要求仅适用于 element0element1element6,那么我需要再次使用 element.pop()

我们有什么东西,我不需要弹出所有不必要的元素吗?因为,如果我的要求只是 3 个元素,那么我需要 pop 数千个元素。这需要时间。

data.json

[
  {
    "fields": {
      "element0": "val0",
      "element1": "val1",
      "element2": "val2",
      "element3": "val3",
      "element4": "val4",
      "element5": "val5",
      "element6": "val6"
    }
  },
  {
    "fields": {
      "element0": "val0",
      "element1": "val1",
      "element2": "val2",
      "element3": "val3",
      "element4": "val4",
      "element5": "val5",
      "element6": "val6"
    }
  }
]

python 代码

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

### my expectation
for element in data:
    element['fields'].pop('element2', None)
    element['fields'].pop('element3', None)
    element['fields'].pop('element4', None)
    element['fields'].pop('element5', None)

expected.json

[
  {
    "fields": {
      "element0": "val0",
      "element1": "val1",
      "element6": "val6"
    }
  },
  {
    "fields": {
      "element0": "val0",
      "element1": "val1",
      "element6": "val6"
    }
  }
]

【问题讨论】:

  • 你为什么要s = s.replace('\'','\"')???请注意,您的“json”根本不是 json。你可能应该解决这个问题
  • 无论如何,我想,你可以选择你想要的元素,而不是弹出你不想要的元素......不确定你是不是这样问。
  • 因为JSONDecodeError: Expecting property name enclosed in double quotes。是的,这就是为什么我将 ' 替换为 "。[link][1] [1]: stackoverflow.com/questions/39491420/…
  • 嗯,准确地说,但这意味着它从来都不是 JSON。无论如何,这个问题完全没有必要?为什么要这样提供?您应该修复文件,而不是添加这个额外的解析元素。
  • 谢谢,我的问题改了

标签: python json element


【解决方案1】:

如果您只需要来自data 的某些元素,您可以执行以下操作:

>>> data = [{'fields': {'element0': 'val0',
...    'element1': 'val1',
...    'element2': 'val2',
...    'element3': 'val3',
...    'element4': 'val4',
...    'element5': 'val5',
...    'element6': 'val6'}},
...  {'fields': {'element0': 'val0',
...    'element1': 'val1',
...    'element2': 'val2',
...    'element3': 'val3',
...    'element4': 'val4',
...    'element5': 'val5',
...    'element6': 'val6'}}]

然后只需选择你需要的字段,然后从嵌套结构中抓取:

>>> NEEDED = "element0", "element1", "element6"
>>> for element in data:
...     fields = element['fields']
...     element['fields'] = {n: fields.get(n) for n in NEEDED}
...

然后数据将是:

>>> data
[{'fields': {'element0': 'val0', 'element1': 'val1', 'element6': 'val6'}}, {'fields': {'element0': 'val0', 'element1': 'val1', 'element6': 'val6'}}]

或者只是重新创建数据:

>>> NEEDED = "element0", "element1", "element6"
>>> data2 = [{'fields': {n: ele['fields'].get(n) for n in NEEDED}} for ele in data]

【讨论】:

  • 这是一个非常好的答案。我有更多要求,我们如何将element0 element1 element6 连同它的值一起带来?我的预期输出如 [{"fields":{"element0":"val0","element1":"val1","element6":"val6"}},{"fields":{"element0":"val0" ,"element1":"val1","element6":"val6"}}]
  • @dtc348 哦,哎呀,是我的错。编辑修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
相关资源
最近更新 更多