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输出,可直接由应用程序使用。一些公开可用的文件包括:
如果您正在寻找更多有关如何善用它的示例,请查看本指南,以构建社交媒体机器人使用Python。
您是否正在使用JSON消费或提供服务?并且您在技术堆栈中使用python吗?请在下面的评论中进行解释。