在开始这个主题之前,让我们简要定义一下JSON的含义。让我们看看 JSON 的主网站是如何定义它的:
JSON (javascript Object Notation)是一种轻量级的数据交换格式。人类很容易阅读和写作。机器很容易解析和生成。它基于 JavaScript 编程语言标准 ECMA-262 第 3 版 - 1999 年 12 月的 一个子集。JSON 是一种完全独立于语言的文本格式,但使用 C 系列语言(包括 C、C++、C#、java、JavaScript、Perl、python 等)的程序员熟悉的约定。这些属性使 JSON 成为一种理想的数据交换语言。
因此,JSON 是一种在 JavaScript 中创建和存储数据结构的简单方法。您在首字母缩略词中看到 JavaScript 的原因是因为使用 JSON 存储数据时会创建一个 JavaScript 对象。但是,不用担心,您不需要了解 JavaScript 即可处理 JSON 文件,而是了解 JSON 语法(格式)本身。
简而言之,JSON 是我们存储和交换数据的一种方式,它通过它的语法来完成,并在许多 Web 应用程序中使用。JSON 的好处在于它具有人类可读的格式,这可能是在数据传输中使用它的原因之一,除了它在使用api时的有效性。
JSON 格式数据的示例如下:
{"name": "Frank", "age": 39, "isEmployed": true}
在本教程中,我将向您展示如何使用 Python 处理 JSON 文件。那么,让我们开始吧!
Python 和 JSON
Python 使处理 JSON 文件变得简单。用于此目的的模块是json模块。这个模块应该包含(内置)在您的 Python 安装中,因此您不需要像我们在处理pdf和Excel文件时那样安装任何外部模块。为了使用这个模块,你唯一需要的就是导入它:
import json
但是,json图书馆是做什么的?该库主要从文件或字符串中解析 JSON。它还将 JSON 解析为 Python 中的字典或列表,反之亦然,即将 Python 字典或列表转换为 JSON 字符串。
JSON 到 Python
读取 JSON 意味着将 JSON 转换为 Python 值(对象)。如上所述,该json库将 JSON 解析为 Python 中的字典或列表。为此,我们使用loads()函数(从字符串加载),如下所示:
import json jsondata = '{"name": "Frank", "age": 39}' jsonToPython = json.loads(jsonData)
如果要查看输出,请执行 a print jsonToPython,在这种情况下,您将获得以下输出:
{u'age': 39, u'name': u'Frank'}
也就是说,数据以 Python 字典(JSON 对象数据结构)的形式返回。那么,该语句会 print jsonToPython['name']返回任何输出吗?来吧,试试看。
Python 转 JSON
在上一节中,我们看到了如何将 JSON 转换为 Python 值(即 Dictionary)。在本节中,我将向您展示如何将 Python 值转换(编码)为 JSON。
假设我们在 Python 中有以下字典:
import json pythonDictionary = {'name':'Bob', 'age':44, 'isEmployed':True} dictionaryToJson = json.dumps(pythonDictionary)
如果我们print dictionaryToJson,我们会得到以下 JSON 数据:
{"age": 44, "isEmployed": true, "name": "Bob"}
所以这个输出被认为是对象(字典)的数据表示。方法dumps()是这种操作的关键。
此时需要注意的是,JSON 不能存储所有类型的 Python 对象,而只能存储以下类型: 列表;字典;布尔值;数字;字符串;和无。因此,任何其他类型都需要转换才能存储在 JSON 中。
假设我们有以下类:
class Employee(object): def __init__(self, name): self.name = name
假设我们创建了一个新对象abder,如下所示:
abder = Employee('Abder')
如果我们想将此对象转换为 JSON 怎么办?那是json.dumps(abder)?在这种情况下,您会收到类似于以下内容的错误:
Traceback (most recent call last): File "test.py", line 8, in <module> abderJson = json.dumps(abder) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 243, in dumps return _default_encoder.encode(obj) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 207, in encode chunks = self.iterencode(o, _one_shot=True) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 270, in iterencode return _iterencode(o, 0) File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 184, in default raise TypeError(repr(o) + " is not JSON serializable") TypeError: <__main__.Employee object at 0x10e74b750> is not JSON serializable
但是,有解决方法吗?幸运的是有。我喜欢 Python Tips 网站上描述的解决方法。为了解决这个问题,我们可以定义一个类似下面的方法:
def jsonDefault(object): return object.__dict__
然后将对象编码为 JSON,如下所示:
jsonAbder = json.dumps(abder, default=jsonDefault)
如果你print jsonAbder,你应该得到以下输出:
{"name": "Abder"}
我们现在已经将 Python 对象 ( abder) 编码为 JSON。
结论
从本教程中,我们可以注意到 Python 一次又一次地证明了它不仅能够处理不同的应用程序,而且还证明了它在处理应用程序时处理不同问题的灵活性,正如我们在本教程的最后一部分中看到的那样。