python 操作json数据

简介

JSON(JavaScript Object Notation, JS对象简谱)是一种轻量级的数据交换格式,通常是以键值对的方式呈现,其简洁和清晰的层次结构使得JSON成为理想的数据交换语言,而在Python中处理JSON格式的模块有json和pickle两个。

json模块和pickle都提供了四个方法:dumps, dump, loads, load
序列化:将python的数据转换为json格式的字符串
反序列化:将json格式的字符串转换成python的数据类型

dumps与loads

dumps与loads主要是针对于json数据的处理,更加关注于数据类型本身。

json_data = {'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}}
content = json.dumps(json_data)
print(content)
print(type(content))
content = json.loads(content)
print(content)
print(type(content))
{"test": {"test1_1": 1}, "test2": {"test2_2": {"test2_3": 2}}, "test3": {"test3_2": {"test3_3": {"test3_4": 3}}}}
<class 'str'>
{'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}}
<class 'dict'>

dump与load

dump与load主要是针对于json文件的处理。

test.json

{
    "test":{
        "test1_1":1
    },
    "test2":{
        "test2_2":{
            "test2_3":2
        }
    },
    "test3":{
        "test3_2":{
            "test3_3":{
                "test3_4":3
            }
        }
    }
}

读取json数据并写入新的json数据

import json, os

JSON_PATH = os.path.join(os.path.dirname(__file__), 'test.json')
JSON_PATH2 = os.path.join(os.path.dirname(__file__), 'test2.json')

with open(JSON_PATH, mode='r', encoding='utf8') as r_f:
    content = json.load(r_f)
    print(content)
    print(type(content))
    with open(JSON_PATH2, mode='w', encoding='utf-8') as w_f:
        json.dump(content, w_f, indent=True)
{'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}}
<class 'dict'>

总结

json.dumps、json.dump是将python数据类型转换为json数据的字符串类型。
json.loads、json.load是将json数据的字符串类型转换为python数据类型,一般为字典
json.dumps与json.loads主要是针对于json数据的处理,更加关注于数据类型本身。
json.dump与json.load主要是针对于json文件的处理。

补充

读取json文件中的所有key值(包含嵌套)

json文件如下:

{
    "test":{
        "test1_1":1
    },
    "test2":{
        "test2_2":{
            "test2_3":2
        }
    },
    "test3":{
        "test3_2":{
            "test3_3":{
                "test3_4":3
            }
        }
    },
    "test4":{
        "test4_2":{
            "test4_3":{
                "test4_4": {
                    "test4_5": 4
                }
            }
        }
    },
    "test5":5
}

import time

data_list = []

# 读取json数据中所有的key
def read_json_key(json_path):
    with open(json_path, mode='r', encoding='utf-8') as f:
        content = json.load(f)
        print(content)
        start = time.time()
        get_json_key(content)
        print(time.time() - start)
        print(f'data_list:{data_list}')
        start = time.time()
        print('get_json_key2:',list(get_json_key2(content)))
        print(time.time() - start)
        start = time.time()
        print('get_json_key3:',list(get_json_key3(content)))   
        print(time.time() - start)
            


def get_json_key(content):
    if isinstance(content, dict) and len(content) > 0:
        for key in content.keys():
            data_list.append(key)
            get_json_key(content[key])

    
def get_json_key2(content):
    if isinstance(content, dict) and len(content) > 0:
        for key in content.keys():
            yield key
            for item in get_json_key2(content[key]):
                yield item

                   

def get_json_key3(content):
    if isinstance(content, dict) and len(content) > 0:
        for key in content.keys():
            yield key
            yield from get_json_key3(content[key])


read_json_key(JSON_PATH)
{'test': {'test1_1': 1}, 'test2': {'test2_2': {'test2_3': 2}}, 'test3': {'test3_2': {'test3_3': {'test3_4': 3}}}, 'test4': {'test4_2': {'test4_3': {'test4_4': {'test4_5': 4}}}}, 'test5': 5}
9.298324584960938e-06
data_list:['test', 'test1_1', 'test2', 'test2_2', 'test2_3', 'test3', 'test3_2', 'test3_3', 'test3_4', 'test4', 'test4_2', 'test4_3', 'test4_4', 'test4_5', 'test5']
get_json_key2: ['test', 'test1_1', 'test2', 'test2_2', 'test2_3', 'test3', 'test3_2', 'test3_3', 'test3_4', 'test4', 'test4_2', 'test4_3', 'test4_4', 'test4_5', 'test5']
1.7642974853515625e-05
get_json_key3: ['test', 'test1_1', 'test2', 'test2_2', 'test2_3', 'test3', 'test3_2', 'test3_3', 'test3_4', 'test4', 'test4_2', 'test4_3', 'test4_4', 'test4_5', 'test5']
1.5974044799804688e-05

上述均使用了递归,分别使用了普通的列表存取,yield, yield from,使用yield和yield from可以减少内存消耗

posted @   形同陌路love  阅读(737)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示