【问题标题】:replace information in Json string based on a condition根据条件替换 Json 字符串中的信息
【发布时间】:2014-07-09 23:44:03
【问题描述】:

我有一个非常大的 json 文件,其中包含多个嵌套键。从我目前所读到的内容来看,如果你这样做:

x = json.loads(data)

Python 会将其解释为字典(如果我错了,请纠正我)。 json 文件中的第四层嵌套包含几个以 ID 号命名的元素,它们都包含一个称为 children 的元素,如下所示:

{"level1":
    {"level2":
        {"level3":
            {"ID1":
                {"children": [1,2,3,4,5]}
            }
            {"ID2":
                {"children": []}
            }
            {"ID3":
                {"children": [6,7,8,9,10]}
            }
      }
   }
}

我需要做的是将所有"children" 元素中的所有项目都替换为空,这意味着"children": [] 如果ID 号在名为new_ids 的列表中,然后将其转换回json。我已经阅读这个主题几个小时了,但我还没有找到任何类似的东西来帮助自己。

我正在运行 Python 3.3.3。任何想法都非常感谢!

谢谢!!

编辑

列表:

new_ids=["ID1","ID3"]

预期结果:

{"level1":
    {"level2":
        {"level3":
            {"ID1":
                {"children": []}
            }
            {"ID2":
                {"children": []}
            }
            {"ID3":
                {"children": []}
            }
      }
   }
}

【问题讨论】:

  • 您遇到了哪些问题?您显然知道如何将 JSON 字符串加载到 Python 对象(是的,它是 dict)。您是否在更改 dict、根据另一个列表进行更改或转换回 JSON 时遇到问题?
  • 好问题,我不知道如何根据另一个列表进行更改,主要问题是指字典,我确实知道如何根据列表而不是字典.
  • 如果您的问题是关于修改 python dicts 并且您已经知道如何处理 JSON 内容,我建议您编辑对 JSON 的引用以解决实际问题。
  • 显示new_ids 和预期结果
  • 好吧,我不知道为什么不正确。

标签: python json python-3.x


【解决方案1】:

首先,您的 JSON 无效。我假设你想要这个:

{"level1":
    {"level2":
        {"level3":
            {
            "ID1":{"children": [1,2,3,4,5]},
            "ID2":{"children": []},
            "ID3":{"children": [6,7,8,9,10]}
            }
        }
    }
}

现在,将您的数据加载为字典:

>>> with open('file', 'r') as f:
...     x = json.load(f)
... 
>>> x
{u'level1': {u'level2': {u'level3': {u'ID2': {u'children': []}, u'ID3': {u'children': [6, 7, 8, 9, 10]}, u'ID1': {u'children': [1, 2, 3, 4, 5]}}}}}

现在您可以遍历x['level1']['level2']['level3'] 中的键并检查它们是否在您的new_ids 中。

>>> new_ids=["ID1","ID3"]
>>> for key in x['level1']['level2']['level3']:
...     if key in new_ids:
...         x['level1']['level2']['level3'][key]['children'] = []
... 
>>> x
{u'level1': {u'level2': {u'level3': {u'ID2': {u'children': []}, u'ID3': {u'children': []}, u'ID1': {u'children': []}}}}}

您现在可以将x 写回到这样的文件中:

with open('myfile', 'w') as f:
    f.write(json.dumps(x))

如果您的new_ids 列表很大,请考虑将其设为set

【讨论】:

  • 太棒了!!!! for 语句和转换回 json 正是我所需要的!!谢谢!!
  • 只是一件事,最初我是这样直接在我的脚本中编码 json 的:json_text="""this is the json stuff""" 并且它有效,但是当我尝试从 txt 文件中读取它时,我收到了这个错误TypeError: Input string must be text, not bytes
  • 你知道为什么会这样吗?
  • @rodrigocf 如果您可以隔离问题并制作一个很好的最小示例,您应该为此打开一个新问题。在 cmets 中总是很难给出一个好的答案。
  • 你是对的,刚刚做到了:stackoverflow.com/questions/24703060/… :)
【解决方案2】:

如果你有这样的简单字典

data_dict = {
    "level1": {
        "level2":{
            "level3":{
                "ID1":{"children": [1,2,3,4,5]},
                "ID2":{"children": [] },
                "ID3":{"children": [6,7,8,9,10]},
            }
        }
    }
}

你只需要这个:

data_dict = {
    "level1": {
        "level2":{
            "level3":{
                "ID1":{"children": [1,2,3,4,5]},
                "ID2":{"children": [] },
                "ID3":{"children": [6,7,8,9,10]},
            }
        }
    }
}

new_ids=["ID1","ID3"]

for idx in new_ids:
    if idx in data_dict['level1']["level2"]["level3"]:
        data_dict['level1']["level2"]["level3"][idx]['children'] = []

print data_dict

'''    
{
    'level1': {
        'level2': {
            'level3': {
                'ID2': {'children': []}, 
                'ID3': {'children': []}, 
                'ID1': {'children': []}
             }
        }
    }
}
'''

但是如果你有更复杂的字典

data_dict = {
    "level1a": {
        "level2a":{
            "level3a":{
                "ID2":{"children": [] },
                "ID3":{"children": [6,7,8,9,10]},
            }
        }
    },
    "level1b": {
        "level2b":{
            "level3b":{
                "ID1":{"children": [1,2,3,4,5]},
            }
        }
    }
}

new_ids =["ID1","ID3"]

for level1 in data_dict.values():
    for level2 in level1.values():
           for level3 in level2.values():
              for idx in new_ids:
                if idx in level3:
                    level3[idx]['children'] = []

print data_dict

'''
{
    'level1a': {
        'level2a': {
            'level3a': {
                'ID2': {'children': []}, 
                'ID3': {'children': []}
            }
        }
    },
    'level1b': {
        'level2b': {
            'level3b': {
                'ID1': {'children': []}
            }
        }
    }
} 
'''

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 2021-06-19
    • 2019-03-31
    • 2021-10-07
    • 2021-12-20
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多