在开始这个主题之前,让我们简要定义一下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']
返回任何输出吗?来试试吧。
正如我们刚刚看到的,JSON 中的对象被转换为 Python 中的字典。JSON数据到Python的转换基于以下转换表。
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()
是这种操作的关键。Python 对象到 JSON 数据的转换基于以下转换表。
Python 字典中的键必须转换为字符串才能用作 JSON 数据。但是,简单的字符串转换仅适用于基本类型,如str
、int
、float
和bool
。对于其他类型的键,这可能会导致TypeError
. skipkeys
您可以通过将参数的值设置为 来避免这种情况发生True
。这将告诉 Python 跳过所有无法转换为字符串的键。
import json class Author: def __init__( self , name): self .name = name monty = Author( 'Monty' ) myDictionary = { 'tobby' : 70 , 'adam' : 80 , monty: 20 , 'andrew' : 75 , 'sally' : 99 } # TypeError: keys must be str, int, float, bool or None, not Author # pythonToJSON = json.dumps(myDictionary) pythonToJSON = json.dumps(myDictionary, skipkeys = True ) # Outputs: {"tobby": 70, "adam": 80, "andrew": 75, "sally": 99} print (pythonToJSON) |
还有一个称为的参数sort_keys
可以设置为True
,以便在按其键对字典进行排序后输出字典。
import json myDictionary = { 'tobby' : 70 , 'adam' : 80 , 'monty' : 20 , 'andrew' : 75 , 'sally' : 99 } pythonToJSON = json.dumps(myDictionary, sort_keys = True ) # Outputs: {"adam": 80, "andrew": 75, "monty": 20, "sally": 99, "tobby": 70} print (pythonToJSON) |
数据的来回转换
您可能已经知道 Python 中字典的键可以是不同的数据类型,例如字符串、整数或元组。但是,JSON 数据中的键只能是字符串。这意味着当您将字典转换为 JSON 时,它的所有键都将转换为字符串。将此 JSON 转换回字典不会让您恢复键的原始数据类型。
import json squares = { 1 : 1 , 2 : 4 , 3 : 9 , 4 : 16 , 5 : 25 , False : None } pythonToJSON = json.dumps(squares) jsonToPython = json.loads(pythonToJSON) # Outputs: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, False: None} print (squares) # {"1": 1, "2": 4, "3": 9, "4": 16, "5": 25, "false": null} print (pythonToJSON) # {'1': 1, '2': 4, '3': 9, '4': 16, '5': 25, 'false': None} print (jsonToPython) |
将不同的数据类型或对象存储为 JSON
在这一点上需要注意的是,JSON 不能存储所有类型的 Python 对象,而只能存储以下类型:列表、字典、布尔值、数字、字符串和无。因此,任何其他类型都需要转换才能存储在 JSON 中。
假设我们有以下类:
class Employee: 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 rai se 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 一次又一次地证明了它不仅能够处理不同的应用程序,而且还证明了它在处理应用程序时处理不同问题的灵活性,正如我们在本教程的最后部分中看到的那样。
发表评论