参考网址:原文链接!!!!在此!!!
一半是对上面网址的解读,一半是夹带 私货。
自码留存,怕自己忘了,没什么别的目的。
环境python2.7
json.dumps()
python代码:
json.dumps() :将字典转化为字符串
json.loads() :将字符串转化为字典
字典:键值对的形式
dict = {
"name":"zhangsan",
"age":24
}
json.dumps()之后变成了字符串
import json
dict = {"name":"zhangsan","age":24}
dict1 = json.dumps(dict)
print(type(dict1)) # <class 'str'>
其实打印出来的效果是一样的,就是类型变了。
可以json.dumps()之后加在url的后面,作为数据传输
比如:
url = "https://blog.csdn.net/"
如果我们需要传一个json参数来调用接口,形如:
url = "https://blog.csdn.net/json?{"name":"zhangsan","age":24}"
这时候就把定义的字典转换为字符,然后加在url后就行:
import json
dict = {"name":"zhangsan","age":24}
dict1 = json.dumps(dict)
print(type(dict1)) # <class 'str'>
url = "https://blog.csdn.net/json?"+dict1
2、json.loads()
当字符串不是json字典格式的字符串的时候,执行json.loads会报错!
代码演示:
1、正确的格式
import json
dict = '{"name":"zhangsan", "age":24}'
dict1 = json.loads(dict)
print(type(dict1)) # <class 'dict'>
2、错误的格式
import json
dict = "{'name':'zhangsan', 'age':24}"
dict1 = json.loads(dict)
print(type(dict1)) # 报错信息json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
上面两种格式的唯一差异就是dict字典的单引号、双引号调换用,那为什么2中就报错呢?
先看报错信息,翻译过来就是“期望用双引号括起来的属性名称”,为什么呢?
因为,json数据的格式有严格要求:json中的(key)属性名称和字符串值需要用双引号引起来,用单引号或者不用引号会导致读取数据错误。
json有两种格式:
1. 对象格式:
{
"name":"tom",
"age":18
}
2. 数组格式:
["tom",18,"programmer"]
3、数组
数组格式的也可以用上面的两种方法进行转换
代码演示:
import json
lsit = [1,4,"hello zhuhai"]
lsit1 = json.dumps(lsit)
print(type(lsit1)) # <class 'str'>
lsit = '[1,4,"hello zhuhai"]'
lsit1 = json.loads(lsit)
print(type(lsit1)) # <class 'list'>
json中的(key)属性名称和字符串值一定要使用双引号引起来
单引号会导致错误。
4.进阶用法——中文和编码
post_data = json.dumps(post_data, ensure_ascii=False, separators=(',',':'))
如果不加上ensure_ascii=False的话,
>>> import json
>>> print json.dumps('中国')
"\u4e2d\u56fd"
输出的会是
‘中国’ 中的ascii 字符码,而不是真正的中文。
因为json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False:
而python3里这样的问题会少很多。
separators=(',',':')
规定了 变成字符串的形式
你也可以用 separators=(', ',' : ')
这样你的字符串里就会多一些空格。你可以自己尝试一下。