【问题标题】:.get method for nested json doesn't work嵌套 json 的 .get 方法不起作用
【发布时间】:2016-02-27 11:37:48
【问题描述】:

我有一个大文件,每一行都包含有效的嵌套json,每个json看起来像(真实数据要大得多,所以这里的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 中只提取一些键值,以获得应该如下所示的数据框:

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: 'list' 对象没有属性 'get'

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

【问题讨论】:

  • 而不是将最后一次调用链接到get,您可以检查您在键Master1 下获得的内容是否是一个列表,然后获取所有列表值或单个值,如果值为Master1 不是列表
  • 顺便问一下,你能把你帖子里的get('Master1','np.nan)改成get('Master1',np.nan)吗?
  • @YannisP。您能否更准确地了解我如何实施它?代码和平,方法?
  • 我希望你能用 Forge 的回答解决这个问题

标签: python json parsing


【解决方案1】:

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

  • 对象:用花括号定义{}
  • 数组:用大括号定义[]
  • :可以是字符串数字对象数组 , 或 文字 truefalsenull
  • 字符串:由双引号定义,包含Unicode字符或普通backslash escapes


使用json.loads 会将string 递归地转换为python object。这意味着每个内部 JSON 元素都将表示为 python 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')

【讨论】:

  • 哇,谢谢!我明白了,但在这种情况下,如何从这个列表中提取值?
  • 哦,就像l=jfile.get.get('Study', dummy) 然后l[0] 给你第一个元素或者你可以编写一个迭代。在此处查看示例:tutorialspoint.com/python/python_lists.htm
  • @Forge 很好的解释和解决方案!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2018-10-15
相关资源
最近更新 更多