Python读取json文件时报错:TypeError:the Json object must be str, bytes or bytearray,not ‘TextIOWrapper’


问题

利用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值