Python 常用模块(二):json模块

news2024/12/25 16:46:08

目录

  • 1. json 模块介绍
    • 1.1 json 模块快用导航
    • 1.2 什么是JSON
      • 1.2.1 JSON的特点
      • 1.2.2 JSON的基本语法
      • 1.2.3 JSON数据类型
      • 1.2.4 JSON示例
      • 1.2.5 JSON使用场景
      • 1.2.6 JSON的优缺点
      • 1.2.7 JSON和XML的比较
    • 1.3 json 模块
  • 2. dump() 方法 --- 转换为 JSON 格式写入文件
    • 2.1 语法参考
    • 2.2 实例演示
      • 2.2.1 将 JSON 格式字符串写入到文件中
      • 2.2.2 防止 ASCII 码写到 json 文件中
      • 2.2.3 将 csv 文件转换为 json 文件
      • 2.2.4 修改 json 文件中的数据
  • 3. dumps() 方法 --- 将 Python 对象转换为 JSON 字符串
    • 3.1 语法参考
    • 3.2 实例演示
      • 3.2.1 Python 对象转换为 JSON 格式的字符串并按照 JSON 格式缩进显示
      • 3.2.2 去掉符号后面的空格
      • 3.2.3 字典类型转换为 JSON 格式字符串
      • 3.2.4 按照字典排序顺序输出 (a 到 z)
      • 3.2.5 将数组转换为 JSON 格式字符串
      • 3.2.6 将列表转换为 JSON 格式字符串
  • 4. load() 方法 --- 从 json 文件中读取数据
    • 4.1 语法参考
    • 4.2 实例演示
      • 4.2.1 从 json 文件中读取数据
      • 4.2.2 读取文本数据并将其转换为JSON格式( 从TXT文本中解析JSON格式)
      • 4.2.3 向原有 json 文件追加数据
  • 5. loads() 方法 --- 将 JSON 格式转换成 Python 字典
    • 5.1 语法参考
    • 5.2 实例演示
      • 5.2.1 简单读取 json 文件中的数据
      • 5.2.2 将 JSON 格式转换为字典
  • 6. JSONDecodeError() 方法 --- 返回解码错误信息
    • 6.1 语法参考
    • 6.2 实例演示
      • 6.2.1 单双引号使用不当导致 JSONDecodeError 错误

博主发现当我们自己不知道 Python 某个模块的用法时,自己又没有相关笔记什么的,一般人很少去官网进行查阅,然后在网上乱找一通,描述的也不详细,非常地浪费时间,故博主决定自己将常用模块中常用的方法进行总结,以便后期自己查阅和网上的朋友们查找学习。今天开始总结我们的第二个常用模块:json 模块。

Python 中的 json 模块提供了对 JSON 的支持,用于将 JSON 格式字符串转换为 Python 对象。首先需要了解一下什么是 JSON

1. json 模块介绍

1.1 json 模块快用导航

在这里插入图片描述

1.2 什么是JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它易于人类阅读和编写,同时也方便机器解析和生成。JSON 是基于 JavaScript 语言的对象表示法,但独立于语言,它已经成为一种常用的标准数据格式,广泛用于 Web 开发、API 数据传输、配置文件等场景。https://www.json.org/json-en.html

1.2.1 JSON的特点

  1. 轻量级:JSON 格式非常简洁,只有少量的语法符号,适合在网络上传输数据。
  2. 结构化数据:JSON 可以表示简单的数据结构,如字符串、数字、布尔值、数组、对象等,也可以表示嵌套的复杂数据结构。
  3. 跨平台:JSON 与编程语言无关,几乎所有的编程语言都提供了处理 JSON 的库或函数,使其广泛使用于多种系统之间的数据交换。

1.2.2 JSON的基本语法

  1. 对象(Object):表示键值对的集合,用大括号 {} 包裹,键和值之间用冒号 : 分隔,多个键值对之间用逗号 , 分隔。
  2. 数组(Array):表示一个有序的值列表,用方括号 [] 包裹,多个值之间用逗号 , 分隔。
  3. 键(Key):必须是字符串类型,并用双引号 "" 包裹。
  4. 值(Value):可以是字符串、数字、布尔值、数组、对象或 null。

1.2.3 JSON数据类型

  1. 字符串(String):必须用双引号括起来。字符串内部可以包含 Unicode 字符、转义字符(如 \n、\t 等)。
  2. 数字(Number):可以是整数或浮点数,表示方式与常规数字相同。
  3. 布尔值(Boolean):两个值,true 或 false,用来表示逻辑状态。
  4. 数组(Array):有序的数据列表,可以包含任何类型的元素(包括嵌套对象和数组)。
  5. 对象(Object):无序的键值对集合,键是字符串,值可以是任何类型的数据。
  6. 空值(null):表示空或无数据。

1.2.4 JSON示例

{
  "name": "Amo",
  "age": 18,
  "isStudent": true,
  "courses": ["Math", "Computer Science"],
  "address": {
    "street": "123 Main St",
    "city": "New York",
    "zipcode": "10001"
  },
  "phoneNumbers": null
}

这个 JSON 对象描述了一个人的基本信息:

  1. name:表示字符串 "Amo"
  2. age:表示数字 18。
  3. isStudent:布尔值,表示是否为学生,值为 true。
  4. courses:表示数组,包含字符串 "Math""Computer Science"
  5. address:嵌套的对象,包含 street、city 和 zipcode 三个字段。
  6. phoneNumbers:表示 null,即没有电话号码信息。

1.2.5 JSON使用场景

  1. 数据传输:JSON 经常用于客户端与服务器之间的数据交换。通过 API 或 AJAX 请求发送和接收 JSON 格式的数据。
  2. 配置文件:JSON 被用作程序和服务的配置文件格式,易于人类阅读和修改。
  3. 数据库:某些 NoSQL 数据库(如 MongoDB)直接使用 JSON 或其变体 BSON 作为数据存储格式。
  4. Web 开发:许多 Web 框架和前端工具(如 React、Vue.js)广泛使用 JSON 处理数据和状态管理。

1.2.6 JSON的优缺点

JSON 的优点:

  1. 易读性:JSON 语法非常简单,易于人类阅读和编写。
  2. 轻量化:相较于 XML,JSON 更简洁,占用的存储空间和传输带宽更小。
  3. 语言无关性:JSON 独立于编程语言,易于与各种编程语言互操作。
  4. 解析速度快:大多数语言都有高效的 JSON 解析库,能快速转换为相应的数据结构。

JSON 的缺点:

  1. 缺乏数据类型支持:JSON 只有有限的几种基本数据类型(字符串、数字、布尔值、数组、对象、null),不支持日期、时间、二进制数据等复杂类型。
  2. 安全性问题:如果不小心将 JSON 数据作为 JavaScript 代码执行,可能导致安全漏洞,如跨站脚本攻击(XSS)。应该始终使用安全的 JSON 解析器。
  3. 无注释:JSON 不支持注释,因此不适合用作需要大量注释的配置文件格式。

1.2.7 JSON和XML的比较

1.3 json 模块

在 Python 中处理 JSON 可以通过内置的 json 模块来完成。主要有两个功能:序列化(将 Python 对象转换为 JSON 格式字符串)和反序列化(将 JSON 格式字符串转换为 Python 对象)。如下图所示:
在这里插入图片描述

2. dump() 方法 — 转换为 JSON 格式写入文件

2.1 语法参考

dump() 方法用于将 Python 对象转换为 JSON 格式字符串后写入到文件中。语法格式如下:

In [21]: json.dump?
Signature:
json.dump(
    obj,
    fp,
    *,
    skipkeys=False,
    ensure_ascii=True,
    check_circular=True,
    allow_nan=True,
    cls=None,
    indent=None,
    separators=None,
    default=None,
    sort_keys=False,
    **kw,
)
Docstring:
Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object).

If ``skipkeys`` is true then ``dict`` keys that are not basic types
(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped
instead of raising a ``TypeError``.

If ``ensure_ascii`` is false, then the strings written to ``fp`` can
contain non-ASCII characters if they appear in strings contained in
``obj``. Otherwise, all such characters are escaped in JSON strings.

If ``check_circular`` is false, then the circular reference check
for container types will be skipped and a circular reference will
result in an ``RecursionError`` (or worse).

If ``allow_nan`` is false, then it will be a ``ValueError`` to
serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
in strict compliance of the JSON specification, instead of using the
JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).

If ``indent`` is a non-negative integer, then JSON array elements and
object members will be pretty-printed with that indent level. An indent
level of 0 will only insert newlines. ``None`` is the most compact
representation.

If specified, ``separators`` should be an ``(item_separator, key_separator)``
tuple.  The default is ``(', ', ': ')`` if *indent* is ``None`` and
``(',', ': ')`` otherwise.  To get the most compact JSON representation,
you should specify ``(',', ':')`` to eliminate whitespace.

``default(obj)`` is a function that should return a serializable version
of obj or raise TypeError. The default simply raises TypeError.

If *sort_keys* is true (default: ``False``), then the output of
dictionaries will be sorted by key.

To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
``.default()`` method to serialize additional types), specify it with
the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.
File:      f:\dev_tools\python\python310\lib\json\__init__.py
Type:      function

参数说明:

(1) obj:表示 Python 对象。
(2) fp:表示一个支持 write() 方法的文件对象。
(3) *:星号本身不是参数。星号表示其后面的参数都是关键字参数,需要使用关键字参数传值,否则程序会出现错误。
(4) skipkeys:默认值为 False。如果值为 True,则不是基本对象 (包括str、int、float、bool、None) 的字典的键会被跳过,否则引发一个 TypeError 错误信息。
(5) ensure_ascii:默认值为 True,会将所有输入的非 ASCII 字符转义输出,如果值为 False,会将输入的非 ASCII 字符原样输出。
(6) check_circular:表示检验循环引用,默认值为 True。如果值为 False,则容器类型的循环引用会被跳过并引发一个 OverflowError 错误。
(7) allow_nan:默认值为 True。如果值为 False,那么在对 JSON 规范以外的 float 类型值 (nan、inf 和 -inf) 进行序列化时将会引发一个 ValueError 错误;如果值为 True,则使用它们的 JavaScript 等价形式(NaN、Infinity 和 -Infinity )。
(8) cls:默认值为 None。通过该关键字参数可以指定自定义的 JSONEncoder 的子类。
(9) indent:默认值为 None。选择最紧凑的表达。如果 indent 是一个非负整数或者字符串,那么 JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "" 则只会添加换行符。当 indent 为一个正整数时会让每一层缩进同样数量的空格;如果 indent 是一个字符串如换行符、制表符 ( "\n""\t") 等,那么这个字符串会被用于每一层。
(10) separators:默认值为 None。该参数是一个元组,即:(',', ': '),其中包含空白字符。如果想要得到最紧凑的 JSON 表达式,应指定该参数为:(',',':'),不要空白字符。
(11) default:默认值为 None。如果要指定该参数,则该参数应是一个函数。每当某个对象无法被序列化时,它就会被调用。它返回该对象的一个可以被 JSON 编码的版本或者引发一个 TypeError (传入参数的类型错误)。如果不指定该参数,则会直接引发 TypeError。
(12) sort_keys:默认值为 False。如果值为True,那么字典的输出会以键的顺序排序。
(13) **kw:其他关键字参数,用于字典。
(14) 返回值:返回 JSON 格式字符串。

在方法或者函数中,如果出现 *,则表示其后面的参数为命名关键字参数,这是一个特殊的分隔符。在调用时,命名关键字参数必须传入参数名。

2.2 实例演示

2.2.1 将 JSON 格式字符串写入到文件中

定义 JSON 格式字符串,然后使用 dump() 方法将其写入 json 文件,代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2024-09-14 10:31
# @Author  : AmoXiang
# @File: json_demo.py
# @Software: PyCharm
# @Blog: https://blog.csdn.net/xw1680


import json

data1 = [{"a": "Amo", "b": (9, 99), "c": 6.6, "d": 11}]
with open("./tmp/aa.json", "w", encoding='utf8') as file:
    json.dump(data1, file, allow_nan=False, sort_keys=True, indent=4)

with open("./tmp/aa.json", "r", encoding='utf8') as file:
    data2 = json.load(file)  # 注意转换之后得类型 至于json.load文章后面会讲
    print(data2)  # [{'a': 'Amo', 'b': [9, 99], 'c': 6.6, 'd': 11}] 'b'对应的数据类型都改变了
    print(data1 == data2)
    print(data1 is data2)

程序运行结果如下图所示:
在这里插入图片描述
运行程序将自动生成 aa.json 文件并保存在与程序同级的 tmp 目录下,用 Pycharm 打开效果如上图所示。命名 Python 工程文件时,千万不要使用 Python 保留的标识符以免发生命名冲突。例如,不能将 Python 工程文件命名为 json.py,因为它与 Python 系统模块 json 命名冲突。

2.2.2 防止 ASCII 码写到 json 文件中

当 JSON 格式字符串中出现中文时,使用 dump() 方法会将 ASCII 码写入到文件中,如下图所示:
在这里插入图片描述
此时需要将参数 ensure_ascii 的值设置为 False,代码如下:

import json

data1 = {
    "Title": "Python 常用模块(二):json模块",
    "author_info": {"name": "小向", "age": 18}}
with open("./tmp/zw.json", "w", encoding="utf8") as f:
    json.dump(data1, f, indent=4, ensure_ascii=False)

程序运行结果如下图所示:
在这里插入图片描述

2.2.3 将 csv 文件转换为 json 文件

如果想将本地文件的数据存入 MongoDB 数据库中,该本地文件数据格式必须是 .csv 或者 .json 格式。将 .csv 格式文件存入 MongoDB 数据库时,列元素之间的顺序会错开,因此需要将 .csv 格式文件转换为 .json 格式再存入 MongoDB 数据库。下面使用 dump() 方法将 .csv 格式转换为 .json 格式,代码如下:

import json
import csv

csv_f = open("csv_test.csv")
reader = csv.DictReader(csv_f)
# 转换为 json 文件
with open("csv_to_json.json", "w") as file:
    for r in reader:
        data = json.dump(r, file, ensure_ascii=False, indent=4)
        file.write(r"\n")

csv 文件(转换前):
在这里插入图片描述
程序运行结果如下图所示:
在这里插入图片描述

2.2.4 修改 json 文件中的数据

修改 json 文件的主要思路是:先读取 json 文件中的数据,将数据暂存起来,然后再将修改后的数据写入 json 文件,代码如下:

import json

with open("aa.json", "r") as file1:
    my_dict = json.load(file1)
    my_dict[0]["a"] = "AmoXiang"
with open("aa.json", "w") as file2:
    json.dump(my_dict, file2, ensure_ascii=False, indent=4)

程序运行结果如下图所示:

3. dumps() 方法 — 将 Python 对象转换为 JSON 字符串

3.1 语法参考

dumps() 方法用于将 Python 对象转换为 JSON 格式的字符串。语法格式如下:

In [22]: json.dumps?
Signature:
json.dumps(
    obj,
    *,
    skipkeys=False,
    ensure_ascii=True,
    check_circular=True,
    allow_nan=True,
    cls=None,
    indent=None,
    separators=None,
    default=None,
    sort_keys=False,
    **kw,
)
Docstring:
Serialize ``obj`` to a JSON formatted ``str``.

If ``skipkeys`` is true then ``dict`` keys that are not basic types
(``str``, ``int``, ``float``, ``bool``, ``None``) will be skipped
instead of raising a ``TypeError``.

If ``ensure_ascii`` is false, then the return value can contain non-ASCII
characters if they appear in strings contained in ``obj``. Otherwise, all
such characters are escaped in JSON strings.

If ``check_circular`` is false, then the circular reference check
for container types will be skipped and a circular reference will
result in an ``RecursionError`` (or worse).

If ``allow_nan`` is false, then it will be a ``ValueError`` to
serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
strict compliance of the JSON specification, instead of using the
JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).

If ``indent`` is a non-negative integer, then JSON array elements and
object members will be pretty-printed with that indent level. An indent
level of 0 will only insert newlines. ``None`` is the most compact
representation.

If specified, ``separators`` should be an ``(item_separator, key_separator)``
tuple.  The default is ``(', ', ': ')`` if *indent* is ``None`` and
``(',', ': ')`` otherwise.  To get the most compact JSON representation,
you should specify ``(',', ':')`` to eliminate whitespace.

``default(obj)`` is a function that should return a serializable version
of obj or raise TypeError. The default simply raises TypeError.

If *sort_keys* is true (default: ``False``), then the output of
dictionaries will be sorted by key.

To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
``.default()`` method to serialize additional types), specify it with
the ``cls`` kwarg; otherwise ``JSONEncoder`` is used.
File:      f:\dev_tools\python\python310\lib\json\__init__.py
Type:      function

dumps() 方法的参数与 dump() 方法的参数使用方法相同,这里不再赘述。

3.2 实例演示

3.2.1 Python 对象转换为 JSON 格式的字符串并按照 JSON 格式缩进显示

通过设置 dumps() 方法的 indent 参数对 JSON 格式的字符串内容进行缩进显示,代码如下:

import json

data1 = [{"a": "Amo", "b": (9, 99), "c": 6.6, "d": 11}]
print("正常: ", json.dumps(data1, allow_nan=False, sort_keys=True))
print("缩进显示: ", json.dumps(data1, allow_nan=False, sort_keys=True, indent=2))

程序运行结果如下:

3.2.2 去掉符号后面的空格

dumps() 方法中 separators 参数的作用是去 :以及, 后面的空格,从下面的输出结果能看到 :以及, 后面都有个空格,这是为了美化输出结果。但是在传输数据的过程中,越精简越好,冗余的东西全部去掉可以提高程序运行效率。因此可以通过设置 separators 参数去掉空格,代码如下:

import json

data = [{"a": "A", "b": (2, 4), "c": 3.0}]
print(f"原数据: {data}")
print(f"转换为JSON格式字符串: {json.dumps(data)}")
print(f"转换为JSON格式字符串的长度: {len(json.dumps(data))}")
print(f"去掉空格后的长度: {len(json.dumps(data, separators=(',', ':')))}")
print(f"去掉空格后: {json.dumps(data, separators=(',', ':'))}")

程序运行结果如下:
在这里插入图片描述
通过运行结果中字符串的长度和去掉空格后的长度对比可以看出,:, 符号后面的空格被去掉了。

3.2.3 字典类型转换为 JSON 格式字符串

使用 dumps() 方法将 Python 字典类型数据转换为 JSON 格式的字符串,代码如下:

import json

a = dict(name="Amo", age=18, QQ="null")
print(a)
print(type(a))
b = json.dumps(a)
print(b)
print(type(b))

程序运行结果如下:
在这里插入图片描述
通过类型函数 type() 判断得出:通过 dumps() 方法可以将 Python 字典类型的数据转换为 JSON 格式的字符串。

3.2.4 按照字典排序顺序输出 (a 到 z)

转换后的 JSON 格式字符串是以紧凑的形式输出的,而且也没有顺序,因此 dumps() 方法提供了一些可选的参数,可以提高输出格式的可读性,如参数 sort_keys 可以告诉编码器按照字典排序 (a到z) 输出,代码如下:

import json

data = [{"a": "paul", "c": (66, 88), "d": 8.8, "b": "ccc"}]
print(f"原数据: {data}")
print(f"JSON格式的字符串: {json.dumps(data)}")
print(f"排序后JSON格式的字符串: {json.dumps(data, sort_keys=True)}")

程序运行结果如下:
在这里插入图片描述

3.2.5 将数组转换为 JSON 格式字符串

使用 dumps() 方法将 Python 列表类型数据转换为 JSON 格式的字符串,代码如下:

import json

data = [{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
to_json = json.dumps(data)
print(to_json)  # [{"a": 1, "b": 2, "c": 3, "d": 4, "e": 5}]
print(type(to_json))  # <class 'str'>

3.2.6 将列表转换为 JSON 格式字符串

使用 dumps() 方法将列表转换为 JSON 格式字符串,代码如下:

import json

li = ["ID", [1, 2, 3], {"name": "你很棒棒"}]  # 创建一个列表
data = json.dumps(li, ensure_ascii=False)  # 将列表转换为JSON格式
print(repr(li))
print(data)  # 打印JSON格式

4. load() 方法 — 从 json 文件中读取数据

4.1 语法参考

load() 方法用于从 json 文件中读取数据。语法格式如下:

In [23]: json.load?
Signature:
json.load(
    fp,
    *,
    cls=None,
    object_hook=None,
    parse_float=None,
    parse_int=None,
    parse_constant=None,
    object_pairs_hook=None,
    **kw,
)
Docstring:
Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
a JSON document) to a Python object.

``object_hook`` is an optional function that will be called with the
result of any object literal decode (a ``dict``). The return value of
``object_hook`` will be used instead of the ``dict``. This feature
can be used to implement custom decoders (e.g. JSON-RPC class hinting).

``object_pairs_hook`` is an optional function that will be called with the
result of any object literal decoded with an ordered list of pairs.  The
return value of ``object_pairs_hook`` will be used instead of the ``dict``.
This feature can be used to implement custom decoders.  If ``object_hook``
is also defined, the ``object_pairs_hook`` takes priority.

To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
kwarg; otherwise ``JSONDecoder`` is used.
File:      f:\dev_tools\python\python310\lib\json\__init__.py
Type:      function

参数说明:
(1) fp:一个支持 read() 方法或包含一个 JSON 格式字符串的文本文件或二进制文件。
(2) *:星号本身不是参数。星号表示其后面的参数都是关键字参数,需要使用关键字参数传值,否则程序会出现错误。
(3) cls:可选参数,实例化的类。
(4) object_hook:可选参数,每一个解码出的对象 (即一个字典) 会取代原来的字典。
(5) parse_float:如果指定了该参数,将使用要解码的每个 JSON float 字符串调用。默认情况下为 float 字符串。此参数用于为 JSON 浮点数指定使用另一种数据类型或解析器 (例如 decimal.Decimal)。
(6) parse_int:如果指定该参数,将使用要解码的每个 JSON int 字符串调用。默认情况下为 int 字符串。此参数用于为 JSON 整数指定使用另一种数据类型或解析器 (例如 float)。
(7) parse_constant:如果指定该参数,将为下列字符串之一:

'-Infinity', 'Infinity', 'NaN'

如果遇到无效的 JSON 字符串,将引发异常。
(8) object_pairs_hook:可选参数,将使用有序的对象列表对解码的任何对象的结果进行调用。用于实现自定义解码器。如果还定义了 object_hook,则 object_pairs_hook 优先。
(9) **kw:其他关键字参数,用于字典。
(10) 返回值:返回字典。

4.2 实例演示

4.2.1 从 json 文件中读取数据

首先使用 write() 方法将字典类型数据写入到一个名为 amo.json 的文件中,然后使用 load() 函数读取该文件中的数据并输出,代码如下:

import json

with open("amo.json", "w+") as file:  # 打开json文件
    # 注意一定要是 外单'' 内部的为"" 否则程序会报错
    file.write('[{"a":"A","c":3.0,"b":[2,4]}]')  # 写入数据
    file.flush()  # 刷新缓冲区
    file.seek(0)  # 移动文件,读取指针到指定位置
    print(json.load(file))  # 读取数据: [{'a': 'A', 'c': 3.0, 'b': [2, 4]}]

4.2.2 读取文本数据并将其转换为JSON格式( 从TXT文本中解析JSON格式)

首先使用 open() 方法读取文本文件 amo.txt 中的数据,然后使用 load() 函数将其转换为 JSON 格式并输出其中的人物名称信息,代码如下:

import json

with open("amo.txt", "r") as file:  # 打开文本文件
    data = json.load(file)  # 读取数据
    for line in data:  # 遍历数据输出人物姓名
        print(line["person"])

4.2.3 向原有 json 文件追加数据

json 文件 student.json 保存了三条学生姓名数据,如下图所示:
在这里插入图片描述
下面以追加方式打开该文件,然后添加两条新数据,代码如下:

import json

with open("student.json", "a+") as file:  # 以追加方式打开文件
    file.seek(0)  # 默认偏移量在最后,调整到开头
    if file.read() == "":  # 判断是否为空,如果为空创建一个新字典
        data = {}
    else:
        file.seek(0)
        data = json.load(file)
    # 追加内容
    data["04"] = "诸葛村夫"
    data["05"] = "司马懿"
with open("student.json", "w") as file:
    json.dump(data, file, ensure_ascii=False)

程序运行结果如下图所示:
在这里插入图片描述

5. loads() 方法 — 将 JSON 格式转换成 Python 字典

5.1 语法参考

loads() 方法用于将 JSON 格式字符串转换成 Python 字典对象。语法格式如下:

In [24]: json.loads?
Signature:
json.loads(
    s,
    *,
    cls=None,
    object_hook=None,
    parse_float=None,
    parse_int=None,
    parse_constant=None,
    object_pairs_hook=None,
    **kw,
)
Docstring:
Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object.

``object_hook`` is an optional function that will be called with the
result of any object literal decode (a ``dict``). The return value of
``object_hook`` will be used instead of the ``dict``. This feature
can be used to implement custom decoders (e.g. JSON-RPC class hinting).

``object_pairs_hook`` is an optional function that will be called with the
result of any object literal decoded with an ordered list of pairs.  The
return value of ``object_pairs_hook`` will be used instead of the ``dict``.
This feature can be used to implement custom decoders.  If ``object_hook``
is also defined, the ``object_pairs_hook`` takes priority.

``parse_float``, if specified, will be called with the string
of every JSON float to be decoded. By default this is equivalent to
float(num_str). This can be used to use another datatype or parser
for JSON floats (e.g. decimal.Decimal).

``parse_int``, if specified, will be called with the string
of every JSON int to be decoded. By default this is equivalent to
int(num_str). This can be used to use another datatype or parser
for JSON integers (e.g. float).

``parse_constant``, if specified, will be called with one of the
following strings: -Infinity, Infinity, NaN.
This can be used to raise an exception if invalid JSON numbers
are encountered.

To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
kwarg; otherwise ``JSONDecoder`` is used.
File:      f:\dev_tools\python\python310\lib\json\__init__.py
Type:      function

参数说明:
(1) s:包含 JSON 格式字符串,字节或字节数组的实例。
(2) *:星号本身不是参数。星号表示其后面的参数都是关键字参数,需要使用关键字参数传值,否则程序会出现错误。
(3) encoding:表示编码方式。
(4) cls:可选参数,实例化的类。
(5) object_hook:可选参数,每一个解码出的对象 (即一个字典) 会取代原来的字典。
(6) parse_float:如果指定了该参数,将使用要解码的每个 JSON float 字符串调用。默认情况下为 float 字符串。此参数用于为 JSON 浮点数指定使用另一种数据类型或解析器 (例如 decimal.Decimal)。
(7) parse_int:如果指定该参数,将使用要解码的每个 JSON int 字符串调用。默认情况下为 int 字符串。此参数用于为 JSON 整数指定使用另一种数据类型或解析器 (例如 float)。
(8) parse_constant:如果指定该参数,将为下列字符串之一:

'-Infinity', 'Infinity', 'NaN'

如果遇到无效的 JSON 字符串,将引发异常。
(9) object_pairs_hook:可选参数,将使用有序的对象列表对解码的任何对象的结果进行调用。用于实现自定义解码器。如果还定义了 object_hook,则 object_pairs_hook 优先。
(10) **kw:其他关键字参数,用于字典。
(11) 返回值:返回字典。

5.2 实例演示

5.2.1 简单读取 json 文件中的数据

使用 loads() 方法读取 json 文件中的数据。例如,读取 city.json 文件中的城市信息,代码如下:

import json

with open("city.json", "r") as file:  # 打开json文件
    data = file.read()  # 读取json文件
    print(type(data))  # 输出数据类型
    result = json.loads(data)  # 将json字符串转换为字典
    print(result)
    new_result = json.dumps(result, ensure_ascii=False)  # 将字典转换为json字符串
    print(new_result)

5.2.2 将 JSON 格式转换为字典

使用 loads() 方法将 JSON 格式字符串转换为字典类型,代码如下:

import json

with open("city.json", "r") as file:
    data = file.read()
    print(type(data))  # <class 'str'>
    val = json.loads(data)
    print(type(val))  # <class 'dict'>
    print(val)

6. JSONDecodeError() 方法 — 返回解码错误信息

6.1 语法参考

JSONDecodeError() 方法用于返回解码错误信息。语法格式如下:

def __init__(self, msg, doc, pos)
msg: 表示未格式化的错误信息。
doc: 表示正在解析的 JSON 文档。
pos: 表示解析失败的 doc 的起始索引。
返回值: 返回 JSONDecodeError 错误信息

6.2 实例演示

6.2.1 单双引号使用不当导致 JSONDecodeError 错误

先来看一段代码:

import json

data = "{'01': '跟着Amo学Python'}"
data = json.loads(data)
print(data)

程序运行结果如图所示:
在这里插入图片描述
运行程序,出现了 JSONDecodeError 错误。现将上述代码稍作修改:

import json

data = '{"01": "跟着Amo学Python"}'
data = json.loads(data)
print(data)

程序运行结果如下:

{'01': '跟着Amo学Python'}

这里需要注意的是,虽然在 Python 中单双引号的作用一样,但是在具体应用中还是有一些不同的地方。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电巢科技2024中国光博会圆满收官

2024年9月11日-13日&#xff0c;备受瞩目的第二十五届中国国际光电博览会(CIOE中国光博会)在中国深圳国际会展中心圆满闭幕。 电巢科技以其前沿的Ecosmos元宇宙产品体验区&#xff0c;及联袂中国光博会打造的三大特色栏目——《逛展最前线》《光引未来大咖说》以及《智能消费电…

【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法

这个方法是摸索出来的&#xff0c;也不一定对&#xff1a; 1、驱动层module_init(module_init_function)作为模块初始化&#xff0c;并且提供模块内部初始化的函数名&#xff1b; 2、找到所有驱动目录drivers下所有module_init(module_init_function)&#xff0c;在内核6.9.0…

探索 Python 代码重构的魔法:rope 库的神秘力量

文章目录 探索 Python 代码重构的魔法&#xff1a;rope 库的神秘力量背景&#xff1a;为何选择 rope&#xff1f;什么是 rope&#xff1f;如何安装 rope&#xff1f;简单的库函数使用方法场景应用常见问题与解决方案总结 探索 Python 代码重构的魔法&#xff1a;rope 库的神秘力…

影视直冲?对接卡券特权充值接口对于用户来说有什么优势?

对用户来说有哪些优势&#xff1a; 便利性&#xff1a;用户可以直接在应用程序或网站上充值和使用卡券&#xff0c;无需通过多个平台或渠道&#xff0c;提高了用户体验。实时性&#xff1a;卡券充值和使用状态可以实时更新&#xff0c;用户可以立即看到余额变化和卡券状态。安…

建造者模式:灵活构建复杂对象的利器

在软件开发中&#xff0c;创建一个复杂对象通常需要多个步骤和参数&#xff0c;直接在客户端代码中进行这些操作不仅繁琐&#xff0c;而且难以维护。建造者模式&#xff08;Builder Pattern&#xff09;提供了一种优雅的解决方案&#xff0c;使得对象的创建过程更加清晰、灵活和…

以最小成本实现最大销售:《稻盛和夫的实学:经营与会计》中的企业经营哲学

在《经营与会计》中稻盛和夫提出&#xff0c;会计是现代企业经营的中枢&#xff0c;经营者必须掌握企业活动的真实状态&#xff0c;才能带领企业长期持续的发展。 经营企业要以现金为基础&#xff0c;把握赚的钱在哪里&#xff0c;以什么形式存在&#xff0c;根据手上确凿无疑…

技术分享-商城篇-营销模块-优惠券种类(二十六)

前言 在之前的文章技术分享-商城篇-优惠券管理-功能介绍及种类&#xff08;二十四&#xff09; &#xff0c;有对优惠券设计做了阐述&#xff0c;优惠券作为一种强大的促销工具&#xff0c;不仅能够吸引新客户&#xff0c;还能促进现有客户的复购与订单金额的提升。但是优惠券…

HTML+CSS - 网页布局之网格布局

1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为&#xff0c;包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一&#xff0c;在文档中创建类似于网格的效果&…

迷你洗衣机哪个牌子好又实惠?5大主流产品综合实测分享!

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

有性价比高的无线蓝牙耳机吗?四款适合学生党的开放式耳机推荐

最近也是大学生高中生都开学了&#xff0c;我想很多学生都想寻找一款性价比高的真无线蓝牙耳机来提升学习和休闲时的音频体验吧。但是市场上的蓝牙耳机品牌和型号繁多&#xff0c;所以并非所有都适合学生群体的预算和需求。只能是由比较专业的耳机测评专家来推荐给学生党入手了…

git编译安装报错

编译安装步骤 卸载旧的 yum -y remove gitcd /usr/local/src/wget https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.xztar -vxf git-2.15.1.tar.xzcd git-2.15.1make prefix/usr/local/git allmake prefix/usr/local/git installecho "export PATH$PATH:/usr…

C++教程(一):超详细的C++矩阵操作和运算(附实例代码,与python对比)

python教程&#xff08;一&#xff09;&#xff1a;超详细的numpy矩阵操作和运算&#xff08;附实例代码&#xff09; 在之前的章节中&#xff0c;我们详细介绍了python中numpy的矩阵操作。但在自动驾驶开发中&#xff0c;我们一般采用C进行功能开发&#xff0c;因此C矩阵运算…

8月最新大模型新书-《自然语言处理:大模型理论与实践》(附PDF)西财赵宇教授新作

介绍 本书主要面向高校本科生、研究生及教学科研人员&#xff0c;适合作为教学用书。同时&#xff0c;它也适合计算语言学家、语言学家、数据科学家和NLP开发人员等专业人士使用。为了照顾不同读者的学科背景差异&#xff0c;书中附录部分专门介绍了与NLP密切相关的基础知识&a…

HAL库学习梳理——SPI(收发Flash数据实验)

实验现象&#xff1a;将LED灯的状态保存到Flash里&#xff0c;掉电读取Flash并设置LED。 1&#xff0c;STM32CubeMx 配置 1.1 SPI引脚说明 外设连接 1.2 参数配置 配置工作模式 主机工作模式 SPI 工作参数设置 1.3 GPIO配置 SPI接线配置 SPI引脚的GPIO配置 2&#xff0c;程序…

大模型开源:ChatGLM-6B (介绍以及本地部署)

简介 ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&#xff…

水位雨量自动监测站的工作原理

水位雨量自动监测站是一种集自动化、智能化于一体的水文监测设施&#xff0c;主要用于实时监测和记录水位及降雨量的变化&#xff0c;为水文预报、水资源管理、防洪减灾等提供科学依据。水位雨量自动监测站主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构…

js读取文件,生成随机题目,多项选择题则提供随机答案供选择

一.第一个要求 根据模板生成随机题目可以将 --- 内的内容 ---变成JSON然后根据参数的限制条件来生成随机参数&#xff0c;再替换到题目中example.md --- Type: Quiz Template Domain: - Geometry Knowledge:- - 數學- 度量、圖形與空間範疇- 弧長和扇形面積- 理解圓的弧長公…

掌握项目全流程:10个项目管理烫知识

一、启动阶段 1、一个清晰且有吸引力的项目愿景对于项目的成功启动至关重要。它能够让所有项目成员以及相关干系人明白项目的最终目标和意义。 在这个阶段&#xff0c;我们可以利用项目管理工具进度猫来可视化地呈现项目的整体愿景&#xff0c;将大的目标拆分成初步的任务板…

RT-DETR训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、RT-DETR简介二、环境搭建三、构建数据集四、修改配置文件①数据集文件配置②模型文件配置③训练文件配置 五、模型训练和测试模型训练模型测试 总结 前言 提示&#xff1a;本文是RT-DETR训练自己数据集的记录教程&#xff0c;需要大家在本地已配置好CUDA,cuD…

302状态如何进行重定向

文章目录 一、302状态是什么意思二、遇到的使用场景三、如何处理customservice.wxmlcustomservice.js 一、302状态是什么意思 302状态码是临时重定向&#xff08;Move Temporarily&#xff09;&#xff0c;表示所请求的资源临时地转移到新的位置。此外还有一个301永久重定向&a…