json对象与string相互转换教程

Posted 诸子流

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了json对象与string相互转换教程相关的知识,希望对你有一定的参考价值。

一、说明

1.1 背景说明

json对象与string相互转换,这东西想写了很多次,但总觉得网上教程比较成熟,所以之前每次都放弃了。但今天又被string转json对象折腾了半天,实在受不了,所以还是要写一写。

 

1.2 问题明确

首先要明确,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

2.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.2 更美观地输出

json对象或者说是dict类型变量是可以直接使用print()函数打印的,但只是那种所有key-value都打印在一行的形式。使用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)

 

三、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://stackoverflow.com/questions/25707558/json-valueerror-expecting-property-name-line-1-column-2-char-1/36599122

https://stackoverflow.com/questions/3733554/how-to-format-dict-string-outputs-nicely

以上是关于json对象与string相互转换教程的主要内容,如果未能解决你的问题,请参考以下文章

json字符串与java对象的相互转换(jackson)

protobuf与json相互转换的方法

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换

FastJson对于JSON格式字符串JSON对象及JavaBean之间的相互转换