2015-06-16 2 views
-3

Используя стандартную библиотеку json, я должен получить значение для ключа в строке json, подобной этой, Также позиция ключа не фиксирована в строке json, и она может быть под некоторым несколькими объектами json, поэтому как бы я перейти на всю строку JSON и искать ключ для извлечения соответствующего значенияjson parser in python

{ 
    "app": { 
     "GardenCategory": { 
      "label": { 
       "Flower": "Rose", 
       "Fruits": "Apple" 
      } 
     }, 
     "Flowers": { 
      "Red_Flowers": "Rose", 
      "Thorn_Flowers": "Marigold", 
      "beautiful_flower": "sunflower", 
     }, 
     "FruitState": { 
      "label": { 
       "Sweet Fruit": "Mango", 
       "Healthy fruits": "Orange", 
       "Liquid fruits": "Water-Melon", 
      } 
     } 
} 
+0

Почему вы должны развивать его? Почему бы не использовать существующую? – TigerhawkT3

+0

Не пишите парсер, используйте модуль 'json'. –

+0

@ TigerhawkT3 Возможно, это домашняя работа по созданию парсера JSON без импорта 'json'. Это так? –

ответ

1

Как отмечено в комментариях, json.load() предоставит вам словарь. Вам просто нужно пройти этот словарь, рекурсивный, если нужно, чтобы найти нужный ключ.

Мой первый проект такой функции:

def find(adict, key): 
    if key in adict.keys(): 
     return adict[key] 
    else: 
     for ndict in adict.values(): 
      return find(ndict, key) 

In [466]: adict={'a':{"b":3, "c":{"d":4}}} 

In [467]: find(adict,'d') 
Out[467]: 4 

In [468]: find(adict,'e') 
... 
AttributeError: 'int' object has no attribute 'keys' 

Поскольку json строка может также содержать списки, функция должна обращаться с тем, как хорошо.

Исправляющие пример я получаю:

In [477]: adict=json.loads(txt) 
In [478]: find(adict,'Flower') 
Out[478]: u'Rose' 

более надежный вариант:

def find1(adict, key): 
    if isinstance(adict, dict): 
     if key in adict.keys(): 
      return adict[key] 
     for ndict in adict.values(): 
      x = find1(ndict, key) 
      if x: return x 
    else: 
     return None 
1

Прежде всего, ваш JSON не отформатирован должным образом. вам необходимо удалить запятые после "beautiful_flower": "sunflower", и "Liquid fruits": "Water-Melon",, вам также не хватает скобки в конце строки.

Следующее, что вам нужно сделать, если у вас есть это как строка, превратить его в словарь в python. Вы можете сделать это следующим образом:

import json 
a='{"app": {"GardenCategory": {"label": {"Flower": "Rose","Fruits": "Apple"}},"Flowers": {"Red_Flowers": "Rose","Thorn_Flowers": "Marigold","beautiful_flower": "sunflower"},"FruitState": {"label": {"Sweet Fruit": "Mango","Healthy fruits": "Orange","Liquid fruits": "Water-Melon"}}}}' 
j=json.loads(a) 

, то вы можете попытаться рекурсивно найти элемент, который нужно с помощью метода:

def find(element, JSON): 
    if element in JSON: 
     return JSON[element] 
    for key in JSON: 
     if isinstance(JSON[key], dict): 
      return find(element, JSON[key]) 

Это будет выглядеть на первом уровне ключей и проверить, если ключ вы хотите находится на первом уровне. если он вернет это значение. Если он не находится на первом уровне, он будет перебирать все ключи и запускать поиск во всех значениях, которые также являются словарями. он вернет значение первого найденного совпадения. например:

find('Sweet Fruit', j) вернется Mango

find('label', j) вернется {'Fruits': 'Apple', 'Flower': 'Rose'}

если то, что вы ищете в словаре не будет возвращать ни

find('foobar', j) вернется None