嵌套json的.get方法不起作用

时间:2016-02-27 11:37:48

标签: python json parsing

我有一个大文件,每行包含有效的嵌套json ,每个json看起来都像(真实数据要大得多,所以这个json的和平只会用于说明):< / p>

       {"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中提取一些键值,以获得看起来像这样的数据帧:

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但它不适用于嵌套的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:&#39; list&#39;对象没有属性&#39; get&#39;

显然它发生是因为"Study"的值不是字典,既不是列表,也不是有效的json!我该如何处理这个问题?是否存在类似.get的方法,但对于json?我想还有另外一个选择:解码这个json,然后用.get解析它,但问题是它在另一个json的核心,所以我不知道如何解码它!

1 个答案:

答案 0 :(得分:3)

Data是有效的JSON格式化字符串。 JSON包含四个基本要素:

  • 对象:使用花括号{}
  • 定义
  • 数组:使用大括号[]
  • 定义
  • :可以是字符串数字对象数组< / em>,或 literals true false null
  • 字符串:由双引号定义,包含Unicode个字符或公共backslash escapes


使用json.loads会递归地将string转换为python object。这意味着每个内部JSON元素都将表示为python object

因此: jfile.get('Study') ---&gt; 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')