Python中JSON对象与字符串互转详解:dumps/loads与ast.literal_eval

阿麦
阿麦
发布时间:2026-10-16 | 4人浏览过
原创

本文详解Python中JSON对象(dict)与字符串的相互转换。介绍使用json.dumps()和json.loads()进行常规转换,并通过indent参数实现格式化输出。针对包含单引号或尾随逗号的特殊字符串,演示如何利用ast.literal_eval()避免ValueError错误,提供完整的代码示例与注意事项。

首先需要明确,Python标准库中提供了json模块,但并没有名为“json”的内置类。因此,所谓的“JSON对象”在Python中本质上就是一个字典(dict)类型。json模块的主要功能是实现字典与字符串之间的相互转换。

具体而言,将JSON对象(即dict)转换为字符串使用json.dumps()函数;反之,将字符串转换为JSON对象(dict)则使用json.loads()函数。此外,json.dump()用于将数据写入文件,而json.load()用于从文件读取数据并转换为JSON对象。

针对容易混淆的转换方向,可以通过记忆技巧来理解:以“json”为参照点,“loads”意为“载入”,即向JSON对象靠拢,因此是将字符串转换为JSON对象;而“dumps”意为“取出”,即从JSON对象远离,因此是将JSON对象转换为字符串。

一、JSON对象(dict)转字符串

1. 简单直接转换——使用json.dumps()

import json

# 变量为dict类型,亦即所谓的json对象
json_dict = {
    "username": "root",
    "password": "toor"
}

# 变量为str类形,json对象转成的字符串
# 值为'{"username": "root", "password": "toor"}'
json_str = json.dumps(json_dict)

# 注意如果将json_dict和json_str都使用print()直接打印出来,看不出什么区别,因为字符串类型变量print出来后最外层的引号会被脱掉
# 唯一的区别是,打印出来的json_dict键值都使用单引号,而json_str内层使用双引号,外层使用单引号

2. 美化输出格式

JSON对象或dict类型的变量可以直接使用print()函数打印,但默认情况下所有键值对会打印在同一行,可读性较差。使用json.dumps()并设置缩进参数,可以将输出格式化为多行缩进形式,便于阅读。

import json

# 变量为dict类型,亦即所谓的json对象
json_dict = {
    "username": "root",
    "password": "toor"
}

# 变量为str类形,json对象转成的字符串
# 值为'{"username": "root", "password": "toor"}'
# json_str = json.dumps(json_dict)

# indent是缩进空格数,这里4表示使用4空格缩进
# 值为'{\n    "username": "root",    \n"password": "toor"\n}'
json_str = json.dumps(json_dict, indent=4)
print(json_str)

# 也可以直接使用json.dump()写到文件
# with open("test.txt", "r", encoding="utf-8") as fd:
#     json.dump(json_dict, fd, indent=4)

# logging模块也可以这样转换再打印实现缩进效果
# json_str = json.dumps(json_dict, indent=4)
# logging.info(json_str)

二、字符串转JSON对象(dict)

常规字符串是指最外层为单引号,内部键值对使用双引号,且最后一对键值后没有逗号的字符串。例如:'{"username": "root", "password": "toor"}'。

特殊字符串是指最外层为双引号,内部键值对使用单引号,或者最后一对键值后带有逗号的字符串。例如:"{'username': 'root', 'password': 'toor'}" 或 '{"username": "root", "password": "toor",}'。

如图所示,如果强行对特殊字符串使用json.loads()进行转换,最外层的引号类型不匹配或末尾多余的逗号都会导致报错:ValueError: Expecting property name: line x column xx (char xx)。

1. 常规字符串转JSON对象(dict)——使用json.loads()

import json

# 变量为str类形,待json对象的常规字符串
json_str = '{"username": "root", "password": "toor"}'
# Python学习交流群:711312441
# 变量为dict类型,亦即所谓的json对象
# {'username': 'root', 'password': 'toor'}
json_dict = json.loads(json_str)

2. 特殊字符串转JSON对象(dict)——使用ast.literal_eval()

import ast

# 变量为str类形,待json对象的特殊字符串
json_str = "{'username': 'root', 'password': 'toor'}"
# json_str = '{"username": "root", "password": "toor",}'
# json_str = "{'username': 'root', 'password': 'toor',}"

# 变量为dict类型,亦即所谓的json对象
# {'username': 'root', 'password': 'toor'}
json_dict = ast.literal_eval(json_str)

至此,关于Python中JSON对象与字符串相互转换的教程介绍完毕。如需了解更多Python JSON对象与字符串转换相关内容,请搜索本站历史文章或继续浏览后续相关文章,感谢大家的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表