python操作 json 文件

分层设计

把代码按照不同的功能分别放到不同的子文件夹中进行管理,代码分层。

  • 测试用例模块:testcases
  • 测试数据目录:testdata
  • 测试报告目录:reports
  • 公共模块:common
  • 项目入口文件:

1. json数据

JSON(JavaScript Object Notation)` 是一种轻量级的数据交换格式,易于阅读和理解。JSON 格式可以对高纬数据进行表达和存储。
json 格式通过键值对来表达信息,键是字符串,值可以是:

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

例如:

{
    "name": "zlf",
    "age": 18,
    "hobby": ["旅游","游戏"],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "张国荣"
        }
    ]
}
{'name': 'zlf',
 'age': 18,
 'hobby': ['旅游', '游戏'],
 'friends': [{'name': '刘德华'}, {'name': '张国荣'}]}

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

2. python操作 json 文件

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

json python
对象(object) 字典(dict)
数组(array) 列表(list)
字符串(string) 字符串(str)
整数(int) 整数(int)
实数(float) 实数(float)
true True
false False
nill None

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

2.1 json 反序列化为 python

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

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

[12]:

import json
json_str = '{"name": "zlf", "age": 18}'
print(json_str, type(json_str))
load_data = json.loads(json_str)
print(load_data, type(load_data))
{"name": "zlf", "age": 18} <class 'str'>
{'name': 'zlf', 'age': 18} <class 'dict'>
  • json.load(fb)
    有时候需要从 json 文件中加载数据,这是一个快捷方法。接收一个以读方式打开的 json 文件对象,将文件中的 json 数据反序列化为一个python对象。
import json
with open('zlf.json','r',encoding='utf-8')as f:
    load_data = json.load(f)
    print(load_data, type(load_data))
{'name': 'zlf', 'age': 18, 'hobby': ['旅游', '游戏'], 'friends': [{'name': '刘德华'}, {'name': '张国荣'}]} <class 'dict'>

python 序列化为 json

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

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

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

    • obj: python 对象
    • ensure_ascii:默认为True,输出保证将所有输入的非ASCLL字符转义。如果ensure_ascii是false,这些字符会原样输出。
    • indent:一个非负整数或者字符串,json 数组元素和对象成员会被美化输出为该值指定的缩进等级。如果缩进等级为零,负数或者"",则只会添加换行符。None''(默认值)选择最紧凑的表达。使用一个正整数会让每一层缩进同样数量的空格。如果indent是一个字符串(比如''"\t"),那这个字符串会被用于缩进每一层。
    • sort_False:为True(more为False),表示字典的输出会以键的顺序排序。
import json
data = {
    "name": "zlf",
    "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": "zlf", "age": 18, "hobby": ["\u65c5\u6e38", "\u6e38\u620f"], "friends": [{"name": "\u5218\u5fb7\u534e"}, {"name": "\u5f20\u56fd\u8363"}]}
{"name": "zlf", "age": 18, "hobby": ["旅游", "游戏"], "friends": [{"name": "刘德华"}, {"name": "张国荣"}]}
{
    "name": "zlf",
    "age": 18,
    "hobby": [
        "旅游",
        "游戏"
    ],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "张国荣"
        }
    ]
}
{
    "age": 18,
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "张国荣"
        }
    ],
    "hobby": [
        "旅游",
        "游戏"
    ],
    "name": "zlf"
}
  • json.dump(obj,fb,ensure_ascii=True,indent=None,sort_False)
    将一个 python 对象序列化为 json 数据后写入一个以 w 模式打开的文件。
  • fb:一个以文件写打开的文件句柄
    其他参数同json.dumps()
import json
data = {
    "name": "zlf",
    "age": 18,
    "hobby": ["旅游","游戏"],
    "friends": [
        {
            "name": "刘德华"
        },
        {
            "name": "张国荣"
        }
    ]
}
with open("zlf.json","a",encoding='utf-8')as f:
    json.dump(data,f,ensure_ascii=False,indent=4)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容