Python - 在JSON中的任何位置查找值并返回位置

时间:2013-08-30 15:29:23

标签: python json dictionary

在Python中,我目前正在处理一个非常大的JSON文件,其中包含一些深层词典和数组。我遇到的问题不在于它。例如,在下面,它主要是国家,有地区/州,城市和郊区。问题是,如果只有一个郊区,它会返回一个字典,但如果不止一个,它是一个带有字典的数组,这使得我必须添加另一行代码才能更深入。当然,可以ifelse /为它,但这只是一个非常小的一部分,并且它一直不适合ifelse。

我想做的只是在比利时中搜索字典条目"code": "8400"中的任何内容,并在JSON文件中返回它的位置。为了做这样的事情,我最好的方法是什么?谢谢!

***SNIP***    
{
        "code": "BE", 
        "name": "Belgium", 
        "regions": {
            "region": [
                {
                    "code": "45", 
                    "name": "Flanders", 
                    "places": {
                        "place": [
                            {
                                "code": "1790", 
                                "name": "Affligem"
                            }, 
                            {
                                "code": "8570", 
                                "name": "Anzegem"
                            }, 
                            {
                                "code": "8630", 
                                "name": "Diksmuide"
                            }, 
                            {
                                "code": "9600", 
                                "name": "Ronse"
                            }
                        ]
                    }, 
                    "subregions": {
                        "subregion": [
                            {
                                "code": "46", 
                                "name": "Coast", 
                                "places": {
                                    "place": [
                                        {
                                            "code": "8300", 
                                            "name": "Knokke-Heist"
                                        }, 
                                        {
                                            "code": "8400", 
                                            "name": "Oostende", 
                                            "subplaces": {
                                                "subplace": {
                                                    "code": "8450", 
                                                    "name": "Bredene"
                                                }
                                            }
                                        }, 
                                        {
                                            "code": "8420", 
                                            "name": "De Haan"
                                        }, 
                                        {
                                            "code": "8430", 
                                            "name": "Middelkerke"
                                        }, 
                                        {
                                            "code": "8434", 
                                            "name": "Westende-Bad"
                                        }, 
                                        {
                                            "code": "8490", 
                                            "name": "Jabbeke"
                                        }, 
                                        {
                                            "code": "8660", 
                                            "name": "De Panne"
                                        }, 
                                        {
                                            "code": "8670", 
                                            "name": "Oostduinkerke"
                                        }
                                    ]
                                }
                            }, 
                            {
                                "code": "47", 
                                "name": "Cities", 
                                "places": {
                                    "place": [
                                        {
                                            "code": "1000", 
                                            "name": "Brussels"
                                        }, 
                                        {
                                            "code": "2000", 
                                            "name": "Antwerp"
                                        }, 
                                        {
                                            "code": "8000", 
                                            "name": "Bruges"
                                        }, 
                                        {
                                            "code": "8340", 
                                            "name": "Damme"
                                        }, 
                                        {
                                            "code": "9000", 
                                            "name": "Gent"
                                        }
                                    ]
                                }
                            }, 
                            {
                                "code": "48", 
                                "name": "Interior", 
                                "places": {
                                    "place": [
                                        {
                                            "code": "2260", 
                                            "name": "Westerlo"
                                        }, 
                                        {
                                            "code": "2400", 
                                            "name": "Mol"
                                        }, 
                                        {
                                            "code": "2590", 
                                            "name": "Berlaar"
                                        }, 
                                        {
                                            "code": "8500", 
                                            "name": "Kortrijk", 
                                            "subplaces": {
                                                "subplace": {
                                                    "code": "8940", 
                                                    "name": "Wervik"
                                                }
                                            }
                                        }, 
                                        {
                                            "code": "8610", 
                                            "name": "Handzame"
                                        }, 
                                        {
                                            "code": "8755", 
                                            "name": "Ruiselede"
                                        }, 
                                        {
                                            "code": "8900", 
                                            "name": "Ieper"
                                        }, 
                                        {
                                            "code": "8970", 
                                            "name": "Poperinge"
                                        }
                                    ]
                                }
                            },

修改

我被要求展示我目前是如何通过这个JSON文件的。 Root是一个字典,其中包含与我正在尝试搜索的城市/郊区相等的数字。它没有定义它是一个城市还是郊区。下面是我的懒惰编码搜索,当我试图学习如何挖掘这个JSON文件,直到我意识到它变得多么复杂并且有点卡住了。 的 SNIP

for k in dataDict['countries']['country']:
    if k['code'] == root['country']:
        for y in k['regions']['region']['places']['place']:
            if y['code'] == root['place']:
                city = y['name']
            else:
                try:
                    for p in y['subplaces']['subplace']:
                        if p['code'] == root['place']:
                            city = p['name']
                except:
                    pass

1 个答案:

答案 0 :(得分:0)

如果我理解的话,每个词典都有以下结构:

{"code": # some int
 "name": # some str
  none / "country" / "place" / whatever # some dict or list

您可以编写一个递归函数来处理一个且只能处理一个字典:

def foo(my_dict):
    if my_dict['code'] == root['place']:
        city = my_dict['name']
    elif "country" in my_dict:
        city = foo(my_dict['country'])
    elif "place" in my_dict:
        # 
        # and so on...
    else:
        city = None
    return city

希望这个例子能帮到你。