1. json 数据

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于阅读和理解。JSON 格式可以对高纬数据进行表达和存储。

JSON 格式通过键值对来表达信息,键是字符串,值可以是:

语法
对象一对大括号包裹,元素是键值对,键值对用逗号分隔 {key:value}
数组一对中括号包裹,元素是 JSON 可以表达的所有数据类型,元素之间使用逗号分隔 [value1,value2,value3]
字符串双引号包裹 "师不予"
整数12
浮点数1.2
布尔型true,false
null

例如:

{
    "name": "Felix",
    "age": 18,
    "hobby": ["运动","妹子"],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "梁朝伟"
        }
    ]
}

创建一个名为 xinlan.json 的文本文件,将上面的 json 数据写入文件中。

2. python 操作 json 文件

直观上,JSON 格式和 python 中的对象类似,对应表示关系如下:

JSONPYTHON
对象(object)字典(dict)
数组(array)列表(list)
字符串(string)字符串(str)
整数(int)整数(int)
实数(float)实数(float)
trueTrue
falseFalse
nullNone

直接通过字符串解析 json 文件不是太简单,python 提供了内置 json 模块用来解析 json 文件。

2.1 json 反序列化为 python

python 对象转 json 字符串称为序列化,反之为反序列化。

json 模块提供了两个函数来支持 json 字符串反序列化为一个 python 对象。

  • json.loads(s)

接收一个 json 格式的字符串,反序列化一个 python 对象。如果参数 s 的格式不满足 json 格式,抛出 JSONDecodeError 异常。

import json
json_str = '{"name":"Felix","age":18}'
print(json_str, type(json_str))
load_data = json.loads(json_str)
print(load_data, type(load_data))

运行结果:

{"name":"Felix","age":18} <class 'str'>
{'name': 'Felix', 'age': 18} <class 'dict'>
  • json.load(fb)

有时候需要从 json 文件中加载数据,这是一个快捷方法。接收一个以读方式打开的 json 文件对象,将文件中的 json 数据反序列化为一个 python 对象。

import json
with open('felix.json','r',encoding='utf-8') as f:
    load_data = json.load(f)
    print(load_data, type(load_data))

运行结果:

{'name': 'Felix', 'age': 18, 'hobby': ['运动', '妹子'], 'friends': [{'name': '刘德华'}, {'name': '梁朝伟'}]} <class 'dict'>

2.2 python 序列化为 json

与反序列化类似,序列化 json 模块也提供了两个对应的函数

  • json.dumps(obj,ensure_ascii=True,indent=None,sort_keys=False)

    将一个 python 对象序列化为一个 json 格式的字符串。

    • obj:python 对象
    • ensure_ascii: 默认为 True,输出保证将所有输入的非 ASCII 字符转义。如果 ensure_ascii 是 false,这些字符会原样输出。
    • indent:一个非负整数或者字符串,JSON 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零、负数或者 "",则只会添加换行符。None``(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果 *indent* 是一个字符串(比如 ``"\t"),那个字符串会被用于缩进每一层。
    • sort_keys:为 True(more 为 False),表示字典的输出会以键的顺序排序。
import json
data = {
"name": "Felix",
    "age": 18,
    "hobby": ['运动','妹子'],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "梁朝伟"
        }
    ]
}
json_str = json.dumps(data)
print(json_str)
print(json.dumps(data,ensure_ascii=False))
print(json.dumps(data,ensure_ascii=False,indent=4))
print(json.dumps(data,ensure_ascii=False,indent=4, sort_keys=True))

运行结果:

{"name": "Felix", "age": 18, "hobby": ["\u8fd0\u52a8", "\u59b9\u5b50"], "friends": [{"name": "\u5218\u5fb7\u534e"}, {"name": "\u6881\u671d\u4f1f"}]}
{"name": "Felix", "age": 18, "hobby": ["运动", "妹子"], "friends": [{"name": "刘德华"}, {"name": "梁朝伟"}]}
{
    "name": "Felix",
    "age": 18,
    "hobby": [
        "运动",
        "妹子"
    ],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "梁朝伟"
        }
    ]
}
{
    "age": 18,
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "梁朝伟"
        }
    ],
    "hobby": [
        "运动",
        "妹子"
    ],
    "name": "Felix"
}
  • json.dump(obj,fb,ensure_ascii=True,indent=None,sort_keys=False)

将一个 python 对象序列化为 json 数据后写入一个以 w 模式打开的文件。

  • fb: 一个以文本写打开的文件句柄

其他参数同 json.dumps()

import json
data = {
	"name": "Felix",
    "age": 18,
    "hobby": ['运动','妹子'],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "梁朝伟"
        }
    ]
}
with open('first.json', 'w', encoding='utf-8') as f:
    json.dump(data,f,ensure_ascii=False,indent=4)