欢迎访问Python每天3分钟系列。

每天早上8点半,学习或温习一个Python知识点。

图片

今天是第025篇:

Python和JSON

今天早上开车出了个小事故,所以今天的3分钟耽误了。很小的剐蹭,人没事,谢谢大家关心。

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分钟了,自定义对象咱们明天再说。

今天就说到这里,有问题给我留言。

声明:本网站资源来源于网络收集,如有侵权,请联系站长进行删除处理。 分享目的仅供大家学习和交流,请不要用于商业用途,否则后果自负。本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解。本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。反馈邮箱:1159995880@qq.com