JSON 对象必须是 str 或 bytes 而不是 TextIOWrapper

JSON 对象必须是 str 或 bytes 而不是 TextIOWrapper

The JSON object must be str or bytes not TextIOWrapper

当我们将文件对象传递给该json.loads()方法时,会出现 Python“TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper”。要解决该错误,请将文件对象传递给该json.load()方法。

typeerror json 对象必须是 str bytes 或 bytearray 而不是 tuple

下面是错误如何发生的示例。

主程序
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: # ⛔️ TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper my_data = json.loads(f)

我们不能将文件对象直接传递给该json.loads()方法,但我们可以使用该json.load()方法将文件反序列化为 Python 对象。

主程序
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) print(my_data) # 👉️ {'name': 'Alice', 'age': 30} print(type(my_data)) # 👉️ <class 'dict'>

上面的代码示例假定您example.json在同一目录中有一个文件。

例子.json
{"name": "Alice", "age": 30}

json.load方法用于将文件反序列化为 Python 对象,而
json.loads方法用于将 JSON 字符串反序列化为 Python 对象。

json.load()方法需要一个包含实现.read()方法的 JSON 文档的文本文件或二进制文件。

或者,您手动调用read()文件对象上的方法并使用该json.loads()方法。

主程序
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: # 👇️ make sure to call read() my_data = json.loads(f.read()) print(my_data) # 👉️ {'name': 'Alice', 'age': 30} print(type(my_data)) # 👉️ <class 'dict'>

上面的示例实现了相同的结果,但是我们没有依赖
json.load()方法为我们调用read()文件对象,而是手动执行并使用该json.loads()方法。

如果需要将 JSON 字符串解析为原生 Python 对象,则必须使用该json.loads()方法,如果需要将 Python 对象转换为 JSON 字符串,则必须使用该json.dumps()方法。

主程序
import json json_str = r'{"name": "Alice", "age": 30}' # ✅ parse JSON string to Python native dict my_dict = json.loads(json_str) print(type(my_dict)) # 👉️ <class 'dict'> # ✅ convert Python native dict to a JSON string my_json_str = json.dumps(my_dict) print(type(my_json_str)) # 👉️ <class 'str'>

json.loads()方法基本上帮助我们从 JSON 字符串加载 Python 本机对象(例如字典或列表)。

该类JSONEncoder默认支持以下对象和类型。

Python JSON
字典 目的
列表,元组 大批
海峡 细绳
int、float、int 和 float 派生枚举 数字
真的 真的
错误的 错误的
没有任何 无效的

如果您不确定变量存储的对象类型,请使用内置
type()类。

主程序
my_dict = {'name': 'Alice', 'age': 30} print(type(my_dict)) # 👉️ <class 'dict'> print(isinstance(my_dict, dict)) # 👉️ True my_str = 'hello world' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True

类型类返回对象的类型

如果传入的对象是传入类的实例或子类,则isinstance
函数返回。
True

结论

当我们将文件对象传递给该json.loads()方法时,会出现 Python“TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper”。要解决该错误,请将文件对象传递给该json.load()方法。