• 日常搜索
  • 端口查询
  • IP查询
  • 在线工具
  • 搜本站

如何使用Python处理JSON文件

在开始这个主题之前,让我们简要定义一下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文件  第1张

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文件  第2张

Python 字典中的键必须转换为字符串才能用作 JSON 数据。但是,简单的字符串转换仅适用于基本类型,如strintfloatbool。对于其他类型的键,这可能会导致TypeErrorskipkeys您可以通过将参数的值设置为 来避免这种情况发生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
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 一次又一次地证明了它不仅能够处理不同的应用程序,而且还证明了它在处理应用程序时处理不同问题的灵活性,正如我们在本教程的最后部分中看到的那样。

文章目录
  • Python 和 JSON
  • JSON 到 Python
  • Python 转 JSON
  • 数据的来回转换
  • 将不同的数据类型或对象存储为 JSON
  • 结论
  • 发表评论