一、说明
1.1 背景说明
json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了。但今天又被string转json对象折腾了半天,实在受不了,所以还是要写一写。
2.1 问题明确
首先要明确,python里有json这个库,但并没有json这个类,所以所谓的json对象本质上就是一个dict;而json这个库,用于实现dict到string、string到dict的互转。
更具体一点,json对象(dict)转string用json.dumps(),string转json对象(dict)用json.loads()。(另外dump()是json输出到文件,load()是从文件载入成json。)
对于哪个转哪个用哪个常弄混的问题,可以这么理解:以json为参照点,loads是向载入的动作靠向json所以是string转成json对象,所以dumps是从取出的动作远离json所以是json对象转成string。
二、json对象(dict)转string----使用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内层使用双引号,外层使用单引号
三、string转json对象(dict)
常规的string----指最外层是单引号,内层键值是双引号,且最后一对键值之后没有逗号的字符串。如‘{"username": "root", "password": "toor"}‘。
特殊的string----指最外层是双引号,内层键值是单引号,或者最一对键值之后有逗号的字符串。如"{‘username‘: ‘root‘, ‘password‘: ‘toor‘}"或‘{"username": "root", "password": "toor",}‘。
如下图可以看到,对于特殊字符串如果强行使用json.loads()要将其转换成json对象,那最外层双引号或最后的逗号都会触发报错:ValueError: Expecting property name: line x column xx (char xx)
3.1 常规的string转json对象(dict)----使用json.loads()
import json # 变量为str类形,待json对象的常规字符串 json_str = ‘{"username": "root", "password": "toor"}‘ # 变量为dict类型,亦即所谓的json对象 # {‘username‘: ‘root‘, ‘password‘: ‘toor‘} json_dict = json.loads(json_str)
3.2 特殊的string转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)
参考:
原文地址:https://www.cnblogs.com/lsdb/p/11906406.html