• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

如何使用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

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 一次又一次地证明了它不仅能够处理不同的应用程序,而且还证明了它在处理应用程序时处理不同问题的灵活性,正如我们在本教程的最后一部分中看到的那样。


文章目录
  • Python 和 JSON
  • JSON 到 Python
  • Python 转 JSON
  • 结论