本文主要介绍了python JSON数据类型及其与python对象之间的转换,欢迎大家的学习。
JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。基于 ECMAScript (w3c制定的js规范)的一个子集,
采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
JSON易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON是一个字符串,能被所有语言读取,很方便地存储到磁盘或者通过网络传输。JSON不仅是标准格式,并且比XML更快,而且能直接在Web页面中读取,非常方便。
JSON和Python内置数据类型对应关系
JSON类型
Python类型
{}
dict
[]
list
"string"
str
1234.56
int或float
true/false
True/False
null
None
Python内置的json模块提供了非常完整的Python对象到JSON格式的转换
Python基本数据类型转JSON字符串
Python的dict对象能直接序列化为JSON的{}
dumps()方法返回一个标准的JSON字符串,dump()方法直接把JSON字符串写入一个file-like Object。
importjson
a = dict(name='Python', nu=2, score=90)
s = json.dumps(a)
print(s)
JSON字符串转Python基本数据类型
loads()方法把JSON字符串转成python对象,load()方法从file-like Object中读取字符串转成python对象。
importjson
json_str = '{"name": "Python", "nu": 2, "score": 90}'a = json.loads(json_str)
print(a)
Python对象(class)转JSON字符串
class对象不能直接序列化为JSON对象,我们需要自定义一个序列化方法为dumps()方法调用
importjson
classUser(object):
def__init__(self, name, nu, language):
self.name = name
self.nu = nu
self.language = language
s = User('aa', 1, 'python')
print(json.dumps(s))
这样会直接报错:TypeError: Object of type 'User' is not JSON serializable
自定义一个序列化方法为dumps()方法调用
dumps()方法的参数列表中第一个obj参数为必须的,dumps()方法还有一个可选参数default用于把任意一个对象变成一个可序列为JSON的对象
importjson
#对象转换为字典defusertodict(user):
return{
'name': user.name,
'nu': user.nu,
'language': user.language
}
classUser(object):
def__init__(self, name, nu, language):
self.name = name
self.nu = nu
self.language = language
s = User('aa', 1, 'python')
print(json.dumps(s, default=usertodict))
输出:{"name": "aa", "nu": 1, "language": "python"}
一般的class对象实例都有一个__dict__属性,是一个dict,用来存储对象的实例变量
改写参数default=lambda obj: obj.__dict__
importjson
classUser(object):
def__init__(self, name, nu, language):
self.name = name
self.nu = nu
self.language = language
s = User('aa', 1, 'python')
print(json.dumps(s, default=lambdaobj: obj.__dict__))
JSON字符串转换为class对象
importjson
defdicttouser(user):
returnUser(user['name'],user['nu'],user['language'])
classUser(object):
def__init__(self, name, nu, language):
self.name = name
self.nu = nu
self.language = language
s = '{"name": "aa", "nu": 1, "language": "python"}'#输出<__main__.user object at>print(json.loads(s, object_hook=dicttouser))