2015-06-23 2 views
3
json = '{ 
    "app": { 
     "Garden": { 
      "Flowers": { 
       "Red flower": "Rose", 
       "White Flower": "Jasmine", 
       "Yellow Flower": "Marigold" 
      } 
     }, 
     "Fruits": { 
      "Yellow fruit": "Mango", 
      "Green fruit": "Guava", 
      "White Flower": "groovy" 
     }, 
     "Trees": { 
      "label": { 
       "Yellow fruit": "Pumpkin", 
       "White Flower": "Bogan" 
      } 
     } 
    }' 

Вот моя JSON строка, которая продолжает изменяться frquently поэтому положение ключей в словаре не то же самое каждый раз, мне нужно поисках ключа и распечатать его соответствующее значение, Поскольку строка json изменяется каждый раз, когда я написал рекурсивную функцию (см. Ниже) для поиска для ввода ключа в новой строке json и печати значения. Однако теперь ситуация заключается в том, что мы имеем один и тот же ключ несколько раз с значениями diff, как может получить полный путь ключа, поэтому было бы легче понять, какое значение ключа оно есть, например результат должен быть таким:JSON получить ключевой путь в гнездовой словаре

app.Garden.Flowers.white Flower = Jasmine 
app.Fruits.White Flower = groovy 
app.Trees.label.White Flower = Bogan 

Мой код до сих пор:

import json 
with open('data.json') as data_file:  
    j = json.load(data_file) 

# j=json.loads(a) 


def find(element, JSON):  
    if element in JSON: 
    print JSON[element].encode('utf-8') 
    for key in JSON: 
    if isinstance(JSON[key], dict): 
     find(element, JSON[key]) 



find(element to search,j) 

ответ

2

Вы можете добавить строковый параметр, который отслеживает текущий путь JSON. Что-то вроде следующего может работать:

def find(element, JSON, path, all_paths):  
    if element in JSON: 
    path = path + element + ' = ' + JSON[element].encode('utf-8') 
    print path 
    all_paths.append(path) 
    for key in JSON: 
    if isinstance(JSON[key], dict): 
     find(element, JSON[key],path + key + '.',all_paths) 

Вы назвали бы это так:

all_paths = [] 
find(element_to_search,j,'',all_paths) 
+0

Спасибо ... однако это рекурсивная функция, и она не будет возвращения None на end..может ли мы это исправить? – min2bro

+0

Возвращение нескольких вещей из такой функции будет сложным. Более простой способ - иметь список, который вы передаете, как я добавил в этой отредактированной версии, которая собирает все конечные пути. После вызова функции 'all_paths' будет иметь все данные, которые будут напечатаны. – Brien

+0

строка 7, в поиске путь = путь + элемент + '=' + JSON [element] .encode ('utf8') UnicodeDecodeError: кодек ascii не может декодировать байт 0xc3 в позиции 3: порядковый номер не в диапазоне (128) – min2bro

0
def getDictValueFromPath(listKeys, jsonData): 
    """ 
    >>> mydict = { 
     'a': { 
      'b': { 
       'c': '1' 
      } 
     } 
    } 
    >>> mykeys = ['a', 'b'] 
    >>> getDictValueFromPath(mykeys, mydict) 
    {'c': '1'} 
    """ 
    localData = jsonData.copy() 
    for k in listKeys: 
     try: 
      localData = localData[k] 
     except: 
      return None 
return localData 

gist

Смежные вопросы