geekdoc-python-zh/docs/pythonlibrary/python-101-an-intro-to-work...

6.0 KiB
Raw Permalink Blame History

python 101:JSON 使用简介

原文:https://www.blog.pythonlibrary.org/2020/09/15/python-101-an-intro-to-working-with-json/

JavaScript Object Notation通常被称为 JSON是一种受 JavaScript object literal 语法启发的轻量级数据交换格式。JSON 对于人类来说很容易读写。也便于计算机解析生成。JSON 用于存储和交换数据,与 XML 的使用方式非常相似。

Python 有一个名为json的内置库,可以用来创建、编辑和解析 JSON。您可以在此阅读关于该图书馆的所有信息:

了解 JSON 的样子可能会有所帮助。这里有一个来自 https://json.org 的 JSON 的例子:

{"menu": {
  "id": "file",
  "value": "File",
  "popup": {
    "menuitem": [
      {"value": "New", "onclick": "CreateNewDoc()"},
      {"value": "Open", "onclick": "OpenDoc()"},
      {"value": "Close", "onclick": "CloseDoc()"}
    ]
  }
}}

从 Python 的角度来看,这个 JSON 是一个嵌套的 Python 字典。你会发现 JSON 总是被翻译成某种原生 Python 数据类型。在本文中,您将了解以下内容:

  • 编码 JSON 字符串
  • 解码 JSON 字符串
  • 将 JSON 保存到磁盘
  • 从磁盘加载 JSON
  • 使用json.tool验证 JSON

JSON 是一种非常流行的格式,经常在 web 应用程序中使用。您会发现,知道如何使用 Python 与 JSON 交互在您自己的工作中很有用。

我们开始吧!

编码 JSON 字符串

Python 的json模块使用dumps()将对象序列化为字符串。dumps()中的“s”代表“弦”。通过在一些代码中使用json模块,可以更容易地看出这是如何工作的:

>>> import json
>>> j = {"menu": {
...   "id": "file",
...   "value": "File",
...   "popup": {
...     "menuitem": [
...       {"value": "New", "onclick": "CreateNewDoc()"},
...       {"value": "Open", "onclick": "OpenDoc()"},
...       {"value": "Close", "onclick": "CloseDoc()"}
...     ]
...   }
... }}
>>> json.dumps(j)
'{"menu": {"id": "file", "value": "File", "popup": {"menuitem": [{"value": "New", '
'"onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, '
'{"value": "Close", "onclick": "CloseDoc()"}]}}}'

这里使用了json.dumps(),它将 Python 字典转换成 JSON 字符串。该示例的输出被修改为换行打印。否则字符串将全部在一行上。

现在您已经准备好学习如何将一个对象写入磁盘了!

将 JSON 保存到磁盘

Python 的json模块使用dump()函数将对象序列化或编码为 JSON 格式的流成为类似文件的对象。Python 中的类文件对象是指使用 Python 的io模块创建的文件处理程序或对象。

继续创建一个名为create_json_file.py的文件,并向其中添加以下代码:

# create_json_file.py

import json

def create_json_file(path, obj):
    with open(path, 'w') as fh:
        json.dump(obj, fh)

if __name__ == '__main__':
    j = {"menu": {
        "id": "file",
        "value": "File",
        "popup": {
          "menuitem": [
            {"value": "New", "onclick": "CreateNewDoc()"},
            {"value": "Open", "onclick": "OpenDoc()"},
            {"value": "Close", "onclick": "CloseDoc()"}
          ]
        }
      }}
    create_json_file('test.json', j)

在本例中,您使用了json.dump(),它用于写入文件或类似文件的对象。它将写入文件处理程序fh

现在您可以学习如何解码 JSON 字符串了!

解码 JSON 字符串

JSON 字符串的解码或反序列化是通过loads()方法完成的。loads()dumps()的配套功能。下面是它的用法示例:

>>> import json
>>> j_str = """{"menu": {
...   "id": "file",
...   "value": "File",
...   "popup": {
...     "menuitem": [
...       {"value": "New", "onclick": "CreateNewDoc()"},
...       {"value": "Open", "onclick": "OpenDoc()"},
...       {"value": "Close", "onclick": "CloseDoc()"}
...     ]
...   }
... }}
... """
>>> j_obj = json.loads(j_str)
>>> type(j_obj)
<class 'dict'>

这里,您将前面的 JSON 代码重新创建为 Python 多行字符串。然后使用json.loads()加载 JSON 字符串,将它转换成 Python 对象。在这种情况下,它将 JSON 转换为 Python 字典。

现在您已经准备好学习如何从文件加载 JSON 了!

从磁盘加载 JSON

使用json.load()从文件加载 JSON。这里有一个例子:

# load_json_file.py

import json

def load_json_file(path):
    with open(path) as fh:
        j_obj = json.load(fh)
    print(type(j_obj))

if __name__ == '__main__':
    load_json_file('example.json')

在这段代码中,您像以前看到的那样打开传入的文件。然后您将文件处理程序fh传递给json.load(),这将把 JSON 转换成 Python 对象。

还可以使用 Python 的json模块来验证 JSON。接下来你会知道如何去做。

使用json.tool验证 JSON

Python 的json模块提供了一个工具,您可以在命令行上运行该工具来检查 JSON 是否具有正确的语法。这里有几个例子:

$ echo '{1.2:3.4}' | python -m json.tool
Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
$ echo '{"1.2":3.4}' | python -m json.tool
{
    "1.2": 3.4
}

第一个调用将字符串'{1.2:3.4}'传递给json.tool,这告诉您 JSON 代码有问题。第二个示例向您展示了如何解决这个问题。当固定字符串被传递给json.tool时,它会“漂亮地打印”出 JSON而不是发出一个错误。

包扎

在处理 web APIs 和 web 框架时,经常使用 JSON 格式。Python 语言为您提供了一个很好的工具,可以用来将 JSON 转换成 Python 对象,然后在json库中再转换回来。

在本章中,您学习了以下内容:

  • 编码 JSON 字符串
  • 解码 JSON 字符串
  • 将 JSON 保存到磁盘
  • 从磁盘加载 JSON
  • 使用json.tool验证 JSON

现在,您有了另一个可以使用 Python 的有用工具。只要稍加练习,您很快就能使用 JSON 了!