JSON(表示“JavaScript对象表示法”)是一种基于文本的格式,它促进了不同应用程序之间的数据交换。例如,在Windows上运行的C++编写的应用程序可以轻松地将JSON数据与应用于Python的应用程序进行运行,并在Linux上运行。它的简单性和灵活性近年来得到了广泛的应用,特别是在更倾向于早期基于XML的格式方面。
有一些库和工具箱可用于从几乎任何语言和环境中解析和生成JSON。本文主要讨论使用python处理JSON时产生的方法和问题。
您将遇到的最常见的JSON实体是一个对象:一组键值映射,格式如下所示。
个人.json:
{ "firstName": "Alice", "lastName": "Hall", "age": 35}下面是如何表示对象数组。在这种表示法中,数组的每一项都是一个对象。以下是棒球运动员的工资样本。
工资.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模块,可以用来解析json,也可以从Python对象和列表生成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"有时,使用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中并只提取所需内容。
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对象被解析为python dict。有时您可能需要从JSON数据自动创建自己类的对象。您可以通过指定处理转换的object\u hook函数来实现这一点。下面的示例演示如何。
这是一个表示个人的自定义类。
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\u hook函数,定义如下:该函数接收python dict并返回正确类的对象。
def obj_creator(d): return Person(d['firstName'], d['lastName'], d['age'])现在可以在调用JSON解析器时使用这个object\u 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现在非常流行。许多网站和SaaS(软件即服务)应用程序提供JSON输出,应用程序可以直接使用这些输出。一些公开的信息包括:
如果您正在寻找更多关于如何更好地使用它的示例,请查看这个使用Python构建社交媒体bot的指南。
您是使用JSON来消费还是提供服务?您在技术堆栈中使用python吗?请在下面的评论中解释。
top-down和bottom-up解析的关键区别在于,top-down解析执行从起始符号到输入字符串的解析,而bottom-down解析执行从输入字符串到起始符号的解析。此外,自顶向下和自底向上解析的另一个重要区别是,自顶向下的解析使用最左边...
... DNS有两个方面:权威(在内容方面)和递归解析器(在ISP方面)。从广义上讲,您可以认为DNS解析程序会提出问题(例如,“我在哪里可以找到这个站点?”),以及****的权威DNS名称服务器。 ...
... 引入数据后,您需要将数据解析到各个组件中。下面是一个由“;”字符分隔的姓名、地址和电话号码信息的示例。 ...
...联赛时间表。接下来,你知道,你每天有17个条目,很难解析你的日历。 好消息是有一个简单的方法来清理你的日历和管理多个日历和事件。退后一步,深呼吸,让我们把事情搞定。 与主帐户共享您的工作日历 这看起来似乎...
...的名称。您应该看到如下内容: 几秒钟后GPS信号将完全解析,您将看到更多信息。如果连接无法解决,则需要在Android设备上尝试其他GPS应用程序,或者重新检查您的独立GPS是否能够传输坐标。 一旦解析阶段完成,您就可以启...
...单,免费,桌面音乐播放器。Tomahawk的有趣之处在于它的解析器和扩展。Tomahawk也可以在Spotify、Soundcloud、YouTube、exfm等服务上查找曲目,而不仅仅是在你的电脑上搜索音乐文件。这实际上把整个互联网变成了你的音乐库。从那里...
...什么不同–主要差异比较 关键术语 C#,转换为int 32,int解析 什么是int解析(int parse)? 使用int-Parse的主要目的是将字符串转换为整数。 Figure 1: Program 1 with int Parse 根据上面的程序,str存储一个字符串。int.Parse将其转换为整数。然...
解析树和语法树的主要区别在于,解析树是一种层次结构,它表示语法的派生以获得输入字符串,而语法树是将编程语言的语法表示为类似于树的层次形式的一种方式 解析树是输入的具体表示。它包含有关输入的所有信息。另...
递归下降解析和预测解析的主要区别在于递归下降解析可能需要或可能不需要回溯,而预测解析不需要任何回溯。 编译过程包括几个阶段。第一阶段是词汇分析。它以字符流的形式扫描源代码,并将其转换为有意义的词素。此...