JSON Python解析:简单指南

JSON(代表“ JavaScript对象表示法")是一种基于文本的格式,可促进各种应用程序之间的数据交换。例如,在Windows上运行的用C ++编写的应用程序可以轻松地与用python编写并在Linux上运行的应用程序交换JSON数据。它的简单性和灵活性导致近年来的广泛使用,尤其是优先于较早的基于XML的格式。

有许多库和工具包可用于从几乎任何语言和环境中解析和生成JSON。本文重点介绍使用python处理JSON所引起的方法和问题。

一些JSON示例

您将遇到的最常见的JSON实体是 object :一组键值映射,格式如下所示。

person.json:

{  "firstName": "Alice",  "lastName": "Hall",  "age": 35}

这里是表示对象数组的方式。在此表示形式中,数组的每个项目都是一个对象。以下是棒球运动员的薪水示例。

salaries.json:

[ {  "year" : 1985,  "teamId" : "ATL",  "leagueId" : "NL",  "playerId" : "barkele01",  "salary" : 870000}, {  "year" : 1985,  "teamId" : "ATL",  "leagueId" : "NL",  "playerId" : "bedrost01",  "salary" : 550000} ]

当然,您也可以表示一系列标量。看起来像这样:

[    "hello",    "world",    35]

在Python中解析JSON

Python提供了 json 模块,该模块可用于解析JSON以及生成JSON

下面的代码段显示了如何打开JSON文件并将数据加载到变量中。

import jsonwith open('sample.json', 'r') as fp:    obj = json.load(fp)

当您包含包含JSON数据的字符串时,您可以使用以下命令将其转换为python对象(或列表):

obj = json.loads("""{  "firstName": "Alice",  "lastName": "Hall",  "age": 35}""")

要解析JSON URL,可以使用 urllib2 创建URL对象并使用 json.load()

import urllib2, jsonurl = urllib2.urlopen('http://site.com/sample.json')obj = json.load(url)

处理错误

当JSON出现错误时,您会收到 ValueError 。您可以处理它,并根据需要采取纠正措施。

try:    obj = json.loads("""{    "firstName": "Alice",    "lastName: "Hall",    "age": 35    }""")except ValueError:    print "error loading JSON"

从命令行解析JSON

有时,使用python命令行解析JSON很有用,也许可以检查错误或获得缩进的输出。

cat glossary.json# prints{"glossary": {"GlossDiv": {"GlossList": {"GlossEntry": {"GlossDef": {"GlossSeeAlso": ["GML", "XML"], "para": "A meta-markup language, used to create markup languages such as DocBook."}, "GlossSee": "markup", "Acronym": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Abbrev": "ISO 8879:1986", "SortAs": "SGML", "ID": "SGML"}}, "title": "S"}, "title": "example glossary"}}

要从上述JSON文件获得缩进的输出,可以执行以下操作:

python -mjson.tool glossary.json# prints{    "glossary": {        "GlossDiv": {            "GlossList": {                "GlossEntry": {                    "Abbrev": "ISO 8879:1986",                    "Acronym": "SGML",                    "GlossDef": {                        "GlossSeeAlso": [                            "GML",                            "XML"                        ],                        "para": "A meta-markup language, used to create markup languages such as DocBook."                    },                    "GlossSee": "markup",                    "GlossTerm": "Standard Generalized Markup Language",                    "ID": "SGML",                    "SortAs": "SGML"                }            },            "title": "S"        },        "title": "example glossary"    }}

以下是如何加载JSON对象的方法

python -c 'import json; fp = open("glossary.json", "r"); obj = json.load(fp); fp.close(); print obj["glossary"]["title"]'# printsexample glossary

访问数据

将JSON数据加载到python变量后,就可以像访问任何python dict一样访问数据了。 (或视情况列出)。例如,可以按以下方式访问上述JSON数据:

firstName = obj["firstName"]lastName = obj["Hall"]age = obj["age"]

数据类型

数据类型是根据数据自动确定的。请注意, age 被解析为整数。

print type(obj["firstName"]), type(obj["lastName"]), type(obj["age"])# prints<type 'unicode'> <type 'unicode'> <type 'int'>

以下转换表用于将JSON转换为python。

使用自定义语法解析JSON类

默认情况下,JSON对象被解析为python dict 。有时您可能需要根据JSON数据自动创建自己的类的对象。您可以通过指定用于处理转换的 object_hook 函数来实现。下面的示例演示如何操作。

这是一个表示 Person 的自定义类。

class Person:    def __init__(self, firstName, lastName, age):        self.firstName = firstName        self.lastName = lastName        self.age = age    def __str__(self):        return '{{"firstName" = "{0}","lastName" = "{1}", "age" = {2}}}'.format(self.firstName, self.lastName, self.age)

该类的实例通过将必需的参数传递为如下:

person = Person("Crystal", "Newell", 27)

要在解析JSON时使用此类创建实例,您需要定义如下的 object_hook 函数:该函数接收一个python dict 并返回正确类的对象。

def obj_creator(d):    return Person(d['firstName'], d['lastName'], d['age'])

您现在可以在调用JSON解析器时使用此 object_hook 函数。

with open('sample.json', 'r') as fp:    obj = json.load(fp, object_hook = obj_creator)print obj# prints{"firstName" = "Alice","lastName" = "Hall", "age" = 35}

JSON用法示例< /

JSON现在非常流行。许多网站和SaaS(软件即服务)应用程序都提供JSON输出,可直接由应用程序使用。一些公开可用的文件包括:

  • StackOverflow / StackExchange。这是一个以JSON格式返回问题列表的URL。
  • GitHub在https://developer.github.com/v3/提供了JSON api。
  • 这是Flickr API:https://developer.yahoo.com/flickr/。
  • 如果您正在寻找更多有关如何善用它的示例,请查看本指南,以构建社交媒体机器人使用Python。

    您是否正在使用JSON消费或提供服务?并且您在技术堆栈中使用python吗?请在下面的评论中进行解释。

    标签: 编程 Python