Python学习:json模块

简介

JSON的全称是 JaveScript Object Notation ,即JavaScript对象符合。JSON是一种轻量级的,跨平台,跨语言的数据交换格式,其设计的目的,是将所有的事情都用设计的字符串来表示,这样可以方便在网上传输数据,也便于人类阅读。

在早期,JSON是JavaScript语言的数据交换格式,后来发展为与特定的编程语言无关的数据交互格式,类似于XML。因此JSON是一种非常理想的数据交换格式。

JSON主要有两种数据结构:

  1. 由key-value对组成的数据结构,这样的数据结构在不同的编程语言中具有不同的实现,比如在Python中是一种字典,在C语言中是一个struct;
  2. 有序集合,这样的数据结构,在Python中对应列表,在C语言中对应数组等。

Python的JSON支持

在Python语言中,json模块提供了对JSON的支持。json模块包含了将JSON字符串恢复成Python对象的函数,也包含了将Python对象转换为JSON字符串的函数。

JSON类型转换为Python类型的对应关系

JSON类型Python类型
对象object字典dict
数组array列表list
字符串string字符串str
整数int整数int
实数real浮点数float
trueTrue
falseFalse
nullNone

在Python交互式解释器中导入json模块后,通过__all__属性可以知道json模块的全部属性与函数:

>>> import json
>>> json.__all__
['dump', 'dumps', 'load', 'loads', 'JSONDecoder', 'JSONDecodeError', 'JSONEncoder']

在json模块中常用的函数包括:

#将 obj 对象转换成 JSON 字符串输出到 fp 流中,fp 是一个支持 write() 方法的类文件对象
json.dump(obj, fp, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

#将 obj 对象转换为 JSON 字符串,并返回该 JSON 字符串
json.dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan= True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

#从 fp 流读取 JSON 字符串,将其恢复成 JSON 对象,其中 fp 是一个支持 read() 方法的类文件对象
json.load(fp, *, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

#将 JSON 字符串 s 恢复成 JSON 对象
json.loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

将Python对象转换为JSON字符串 范例

范例代码如下,实际上dumps与dump函数的功能,所支持的选项基本相同,只是dumps函数直接返回转换得到的JSON字符串,而dump函数则将转换得到的JSON字符串输出到文件中:

import json

# 将Python对象转JSON字符串(元组会当成数组)
s = json.dumps(['yeeku', {'favorite': ('coding', None, 'game', 25)}])
print(s) # ["yeeku", {"favorite": ["coding", null, "game", 25]}]

# 简单的Python字符串转JSON
s2 = json.dumps("\"foo\bar")
print(s2) #"\"foo\bar"

# 简单的Python字符串转JSON
s3 = json.dumps('\\')
print(s3) #"\\"

# Python的dict对象转JSON,并对key排序
s4 = json.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
print(s4) #{"a": 0, "b": 0, "c": 0}

# 将Python列表转JSON,
# 并指定JSON分隔符:逗号和冒号之后没有空格(默认有空格)
s5 = json.dumps([1, 2, 3, {'x': 5, 'y': 7}], separators=(',', ':'))
# 输出的JSON字符串中逗号和冒号之后没有空格
print(s5) # '[1,2,3,{"4":5,"6":7}]'

# 指定indent为4,意味着转换的JSON字符串有缩进
s6 = json.dumps({'Python': 5, 'Kotlin': 7}, sort_keys=True, indent=4)
print(s6)

# 使用JSONEncoder的encode方法将Python转JSON
s7 = json.JSONEncoder().encode({"names": ("孙悟空", "齐天大圣")})
print(s7) # {"names": ["\u5b59\u609f\u7a7a", "\u9f50\u5929\u5927\u5723"]}

f = open('a.json', 'w')
# 使用dump()函数将转换得到JSON字符串输出到文件
json.dump(['Kotlin', {'Python': 'excellent'}], f)

将JSON字符串转换为Python对象 范例

范例代码如下:

import json

# 将JSON字符串恢复成Python列表
result1 = json.loads('["yeeku", {"favorite": ["coding", null, "game", 25]}]')
print(result1) # ['yeeku', {'favorite': ['coding', None, 'game', 25]}]

# 将JSON字符串恢复成Python字符串
result2 = json.loads('"\\"foo\\"bar"')
print(result2) # "foo"bar

# 定义一个自定义的转化函数
def as_complex(dct):
    if '__complex__' in dct:
        return complex(dct['real'], dct['imag'])
    return dct
# 使用自定义的恢复函数
# 自定义回复函数将real数据转成复数的实部,将imag转成复数的虚部
result3 = json.loads('{"__complex__": true, "real": 1, "imag": 2}', object_hook=as_complex)
print(result3) # (1+2j)

f = open('a.json')
# 从文件流恢复JSON列表
result4 = json.load(f)
print(result4) # ['Kotlin', {'Python': 'excellent'}]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值