2016-02-27 2 views
1

У меня есть большой файл, содержащий действительный вложенный json на каждой строке, каждый json выглядит (реальные данные намного больше, поэтому этот мир json будет показан для иллюстрации только):.get метод для вложенного json не работает

 {"location":{"town":"Rome","groupe":"Advanced", 
      "school":{"SchoolGroupe":"TrowMet", "SchoolName":"VeronM"}}, 
      "id":"145", 
      "Mother":{"MotherName":"Helen","MotherAge":"46"},"NGlobalNote":2, 
      "Father":{"FatherName":"Peter","FatherAge":"51"}, 
      "Study":[{ 
      "Teacher":["MrCrock","MrDaniel"], 
      "Field":{"Master1":["Marketing", "Politics", "Philosophy"], 
      "Master2":["Economics", "Management"], "ExamCode": "1256"} 
      }], 
      "season":["summer","spring"]} 

Мне нужно разобрать этот файл, чтобы извлечь только некоторые ключевые значения из каждого JSON, чтобы получить dataframe, который должен выглядеть как:

Groupe  Id MotherName FatherName Master2 
Advanced 56 Laure   James  Economics, Management 
Middle  11 Ann   Nicolas  Web-development 
Advanced 6 Helen   Franc  Literature, English Language 

Я использую method proposed me in the other question.get но он не работает wi го вложенного JSON, так, например, если я стараюсь:

def extract_data(data): 
    """ convert 1 json dict to records for import""" 
    dummy = {} 
    jfile = json.loads(data.strip()) 
    return (
    jfile.get('Study', dummy).get('Field', np.nan).get('Master1',np.nan), 
    jfile.get('location', dummy).get('groupe', np.nan)) 

для этой линии jfile.get('Study', dummy).get('Field', np.nan).get('Master1', np.nan) он бросает мне ошибку:

AttributeError: 'list' object has no attribute 'get'

, очевидно, это происходит потому, что значение "Study" не словарь, ни список , но действительный json! как я могу справиться с этой проблемой? Существует ли метод, который работает как .get, но для json? Я думаю, есть еще один вариант: декодировать этот json, а затем разобрать его с помощью .get, но проблема в том, что он находится в ядре другого json, поэтому я не знаю, как его декодировать!

+0

Вместо цепочки последнего вызова 'get' вы можете проверить, то, что вы получаете под ключом «Мастер1», является списком, а затем получает все значения списка или, альтернативно, одно значение, если значение «Мастер1» не является списком –

+0

Кстати, вы могли бы исправить «get (« Master1 », 'np.nan) 'to' get (' Master1 ', np. nan) 'в вашем посте? –

+0

@YannisP. не могли бы вы уточнить, как я могу его реализовать, пожалуйста? Мир кода, метод? – Amanda

ответ

3

Data является действительной строкой JSON. JSON содержит четыре основных элемента:

  • Объект: определяется с помощью фигурных скобок {}
  • массива: определяется с фигурными скобками []
  • Значение: может быть строка, A номер , a объект, a массив, или литералов верно, ложных или нуля
  • Строки: определяемся в двойных кавычках и содержат Unicode символ или общие backslash escapes


Использование json.loads преобразует string в python object рекурсивно. Это означает, что каждый внутренний элемент JSON будет представлен как питон object.

Поэтому: jfile.get('Study') --->python list


Чтобы получить Field вы должны пройти по списку исследования:

file = json.loads(data.strip()) 
study_list = jfile.get('Study', []) # don't set default value with different type 
for item in study_list: 
    print item.get('Field') 
+0

ow, спасибо! Я понял, но в этом случае, как я могу извлечь значение из этого списка? – Amanda

+0

О, это как 'l = jfile.get.get ('Study', dummy)', а затем 'l [0]' дает вам первый элемент или вы можете написать итерацию. См. Примеры здесь: http://www.tutorialspoint.com/python/python_lists.htm –

+1

@Forge отличное объяснение и решение! Большое спасибо! – Amanda

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