根据条件替换Json字符串中的信息

时间:2014-07-09 23:44:03

标签: python json python-3.x

我有一个非常大的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"元素中的所有项都替换为空,如果ID号位于名为"children": []的列表中,则为new_ids,然后将其转换回来到了json。我一直在阅读这个主题几个小时但是我没有发现任何类似的东西试图帮助自己。

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

谢谢!

修改

列表:

new_ids=["ID1","ID3"]

预期结果:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果你有像这样的简单字典

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': []}
            }
        }
    }
} 
'''