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

标签 python json parsing

我有一个大文件,每行都包含有效的嵌套 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' object has no attribute 'get'

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

最佳答案

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

  • 对象:用大括号定义{}
  • 数组:用大括号定义[]
  • :可以是字符串数字对象数组,或文字 truefalsenull
  • 字符串:由双引号定义,包含 Unicode 字符或常见的反斜杠转义符


使用json.loads将以递归方式将字符串转换为Python 对象。这意味着每个内部 JSON 元素都将表示为一个 python object

因此: jfile.get('Study') ---> python 列表


要检索 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')

关于python - 嵌套 json 的 .get 方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35669227/

相关文章:

python - 查找错误 : No installed app with label 'user'

python - 如何将模糊函数与 apply(lambda x : ) function?

json - @RequestBody无法与@JsonProperty一起使用

java - 解析 Json 数据给出 ClassCastException

python - 如何使用 YAML 配置 Python 日志记录以登录 UTC?

python - 将 Pandas 数据框中的两列展开为列表列表

android - GCM 是如何工作的? (适用于 Android 的谷歌云消息传递)

javascript - 如何使用 javascript 将 json 对象附加到 html 正文? (没有 jQuery)

parsing - 用于从 [string] 解析输入参数-值对的 native 机制

ios - Swift 上基于流的 JSON 解析