文章目录
问题
利用Python中的json库读取json文件时,因为错误使用了相应的方法导致报错:TypeError:the Json object must be str, bytes or bytearray,not‘TextIOWrapper’。
分析
首先要弄明白json库的四个方法:dumps和loads、dump和load。其中,dumps和loads是在内存中转换(python对象和json字符串之间的转换),而dump和load则是对应于文件的处理;下面的函数说明中已经很清楚的说明了这一点。
出现这个错误的原因是自己用了loads方法去将json文件转换为python对象,而正确的应该是使用load方法。
json的主要方法的部分源码
说明:
- Serialize :序列化:将对象转化为对应的字符串。
- Deserialize :反序列化:将字符串转化为对应的对象。
源码中的函数说明(不包含参数介绍,有需要可以自己去看源码):
def 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):
"""Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
``.write()``-supporting file-like object).
"""
def 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):
"""Serialize ``obj`` to a JSON formatted ``str``.
"""
def load(fp, *, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
a JSON document) to a Python object.
"""
def loads(s, *, encoding=None, cls=None, object_hook=None, parse_float=None,
parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
"""Deserialize ``s`` (a ``str``, ``bytes`` or ``bytearray`` instance
containing a JSON document) to a Python object.
"""
举例
下面代码中的第一种为读取本地文件,然后转化为json对象;第二种为获取在线json数据,然后转化为json对象(实际到内存)。
# 1.打开一个本地json文件
data = open("./a.json", encoding='utf-8')
# 反序列化,转换为python对象
result = json.load(data)
print(result)
# 2.获取在线的json数据(王者荣耀英雄列表的json数据)
json_url = 'https://pvp.qq.com/web201605/js/herolist.json'
# 获取该json数据的文本(字符串)
text = requests.get(json_url).text
print(text)
# 反序列化,转换为python对象
result = json.loads(text)
部分内容参考:https://blog.csdn.net/NOT_GUY/article/details/80954328