返回介绍

第15单元 读取 JSON 文件

发布于 2024-01-28 22:01:16 字数 2353 浏览 0 评论 0 收藏 0

JSON是一种轻量级的数据交换格式。该格式跟编程语言无关,这一点不同于pickle模块(第12单元提过),但在数据表示方面,JSON有更多的限制,不如pickle灵活。

 什么人在使用JSON?

许多流行的网站,比如Twitter3、Facebook4和Yahoo! Weather5,都提供使用JSON作为数据交换格式的API。

3dev.twitter.com/overview/documentation

4developers.facebook.com

5developer.yahoo.com/weather/

JSON支持以下数据类型。

原子数据类型——字符串、数字、true、false和null

数组——使用方括号[]表示,对应Python的列表,数组各项可以使用不同的数据类型:

[1, 3.14, "a string", true, null]

对象——使用花括号({})表示,对应Python的字典,对象各项由冒号分隔的键和值组成:

{"age" : 37, "gender" : "male", "married" : true}

数组、对象和原子数据类型的任何递归组合(对象数组、项为数组的对象,等等)

有一个不尽如人意之处,那就是某些Python数据类型和结构(比如集合和复数)无法存储在JSON文件中。因此,要在导出到JSON之前,将它们转换为JSON可表示的数据类型。例如,将复数存储为两个double类型的数字组成的数组,将集合存储为一个由集合的各项所组成的数组。

将复杂数据存储到JSON文件中的操作称为序列化,相应的反向操作则称为反序列化。Python通过json模块中的函数,实现JSON序列化和反序列化。

函数dump()将一个能用JSON表示的Python对象导出(dump)到先前打开的文本文件。函数dumps()导出的Python对象为文本字符串(这是为了打印出美观的结果或实现进程间通信)。dump()和dumps()这两个函数都实现了序列化。

 pickling的意义

当数据保存到JSON文件时,只是保存了变量的值,重新加载后,这些值都是相互独立的。当使用pickle来保存同样的数据时,保存的是原始变量的引用,重新加载后,对同一变量的所有引用关系维持不变。

函数loads()将有效的JSON字符串转换为Python对象(即将对象“加载”到Python中)。实际中,总会遇到这样的转换。类似地,函数load()将已打开的文本文件的内容转换为一个Python对象。把多个对象存储在一个JSON文件中是一种错误的做法,但如果已有的文件包含多个对象,则可将其以文本的方式读入,进而将文本转换为对象数组(在文本中各个对象之间添加方括号和逗号分隔符),并使用loads()将文本反序列化为对象列表。

以下代码片段实现了将任意(可序列化的)对象按先序列化、后反序列化的顺序进行处理:

object = «some serializable object»
# 将对象保存到文件
with open("data.json", "w") as out_json:
  json.dump(object, out_json, indent=None, sort_keys=False)
# 从文件载入对象
with open("data.json") as in_json:
  object1 = json.load(in_json)
# 将对象序列化为字符串
json_string = json.dumps(object1)
# 把字符串解析为JSON
object2 = json.loads(json_string)

尽管经历了四次“痛苦”的转换,object、object1和object2仍然具有相同的值。

当预期到结果可能会被进一步处理或导入另一个程序时,通常都使用JSON格式来存储最终处理结果。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文