Python 删除嵌套键和特定值的键

huangapple go评论98阅读模式
英文:

Python remove nested keys and a certain value's keys

问题

  1. 需要删除任何键的任何级别中具有值为 null 的值
  2. 需要删除名为 key_2.key_c 的任何链接键
    应该得到以下结果块。

原始 JSON

  1. {
  2. "key_1": {
  3. "key_a": 111111
  4. },
  5. "key_2": {
  6. "key_a": "value",
  7. "key_b": null,
  8. "key_c": {
  9. "key_c_a": {
  10. "key_c_b": "value"
  11. }
  12. },
  13. "key_d": [
  14. {
  15. "key_c": "value"
  16. }
  17. ]
  18. }
  19. }

结果

  1. {
  2. "key_1": {
  3. "key_a": 111111
  4. },
  5. "key_2": {
  6. "key_a": "value",
  7. "key_d": [
  8. {
  9. "key_c": "value"
  10. }
  11. ]
  12. }
  13. }
英文:

1.Need to remove any value in any level of the keys that has a value null
2.Need to remove any chained key that is named key_2.key_c
Should result in the outcome block below.

Original json

  1. {
  2. "key_1": {
  3. "key_a": 111111},
  4. "key_2": {
  5. "key_a": "value",
  6. "key_b": null,
  7. "key_c": {
  8. "key_c_a": {
  9. "key_c_b": "value"}
  10. },
  11. "key_d": [{"key_c": "value"}],
  12. }

Outcome

  1. {
  2. "key_1": {
  3. "key_a": 111111},
  4. "key_2": {
  5. "key_a": "value",
  6. "key_d": [{"key_c": "value"}],
  7. }

答案1

得分: 1

你可以通过递归遍历输入的JSON对象并过滤掉不需要的值来实现这一目标:

  1. import json
  2. def filter_json(obj):
  3. if isinstance(obj, dict):
  4. new_obj = {}
  5. for k, v in obj.items():
  6. if v is None:
  7. continue
  8. if k == "key_2":
  9. new_obj[k] = filter_json({k2: v2 for k2, v2 in v.items() if k2 != "key_c"})
  10. else:
  11. new_obj[k] = filter_json(v)
  12. return new_obj
  13. elif isinstance obj, list:
  14. return [filter_json(elem) for elem in obj]
  15. else:
  16. return obj

使用:

  1. json_str = '''
  2. {
  3. "key_1": {
  4. "key_a": 111111
  5. },
  6. "key_2": {
  7. "key_a": "value",
  8. "key_b": null,
  9. "key_c": {
  10. "key_c_a": {
  11. "key_c_b": "value"
  12. }
  13. },
  14. "key_d": [
  15. {
  16. "key_c": "value"
  17. }
  18. ]
  19. }
  20. }
  21. '''
  22. json_obj = json.loads(json_str)
  23. filtered_obj = filter_json(json_obj)
英文:

You can achieve this by recursively traversing the input JSON object and filtering out the unwanted values:

  1. import json
  2. def filter_json(obj):
  3. if isinstance(obj, dict):
  4. new_obj = {}
  5. for k, v in obj.items():
  6. if v is None:
  7. continue
  8. if k == "key_2":
  9. new_obj[k] = filter_json({k2: v2 for k2, v2 in v.items() if k2 != "key_c"})
  10. else:
  11. new_obj[k] = filter_json(v)
  12. return new_obj
  13. elif isinstance(obj, list):
  14. return [filter_json(elem) for elem in obj]
  15. else:
  16. return obj

Usage


  1. json_str = '''
  2. {
  3. "key_1": {
  4. "key_a": 111111
  5. },
  6. "key_2": {
  7. "key_a": "value",
  8. "key_b": null,
  9. "key_c": {
  10. "key_c_a": {
  11. "key_c_b": "value"
  12. }
  13. },
  14. "key_d": [
  15. {
  16. "key_c": "value"
  17. }
  18. ]
  19. }
  20. }
  21. '''
  22. json_obj = json.loads(json_str)
  23. filtered_obj = filter_json(json_obj)

huangapple
  • 本文由 发表于 2023年2月18日 00:19:34
  • 转载请务必保留本文链接:https://go.coder-hub.com/75486784.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定