Python和JSON
JSON是最主流的网络传输格式,但Python对JSON的处理并不友好,下面你会理解。
简单例子
Python自带了一个名为json的包,无需安装可以直接使用。通过它可以把Python自带对象(str, list, dict等)转成JSON字符串,或者反过来。
先看一个简单的例子:
food = [
{'name':'pizza', 'origin':'Italy'},
{'name':'hamburger', 'origin':'UK'},
]
import json
# 把对象转成JSON字符串
food_json = json.dumps(food)
print(f'检查一下food_json的类型,是字符串:{type(food_json)}')
print('打印一下结果:')
print(food_json)
# 把JSON字符串转成对象
from_json = json.loads(food_json)
print(f'看一下类型,应该是列表:{type(from_json)}')
注释写的也比较清楚了,以下几个要点:
- food是一个列表,里面是字典存放一个具体的食物的信息。
- 通过json.dumps方法可以把Python对象转成JSON字符串。
- 通过json.loads方法可以把JSON字符串转回到Python对象
输出结果:
检查一下food_json的类型,是字符串:<class 'str'>
打印一下结果:
[{"name": "pizza", "origin": "Italy"}, {"name": "hamburger", "origin": "UK"}]
看一下类型,应该是列表:<class 'list'>
格式化
现在打印的结果是这样的,如果数据多了并不好看:
[{"name": "pizza", "origin": "Italy"}, {"name": "hamburger", "origin": "UK"}]
我们可以在dumps函数中指定缩进格式:
#指定缩进4格
food_json = json.dumps(food, indent=4)
这样打印的就漂亮多了:
[
{
"name": "pizza",
"origin": "Italy"
},
{
"name": "hamburger",
"origin": "UK"
}
]
中文例子
前面是英文的例子,换成中文试试:
food = [
{'name':'胡辣汤', 'origin':'山东'},
{'name':'油条', 'origin':'河南'},
]
import json
# 把对象转成JSON字符串
food_json = json.dumps(food, indent=4)
print(food_json)
打印结果竟然是这样的:
[
{
"name": "\u80e1\u8fa3\u6c64",
"origin": "\u5c71\u4e1c"
},
{
"name": "\u6cb9\u6761",
"origin": "\u6cb3\u5357"
}
]
竟然都成了字节码,不好看啊!这是因为json默认用的是ascii码,中文当然不能显示了。
我们可以指定一下编码:
# 加一个参数告诉json这不一定是ascii
food_json = json.dumps(food, ensure_ascii=False, indent=4)
这样结果就好看了:
[
{
"name": "胡辣汤",
"origin": "山东"
},
{
"name": "油条",
"origin": "河南"
}
]
自定义对象例子
对于自定义的类,json就不能转化了,这很坑。而且这明显超过3分钟了,自定义对象咱们明天再说。