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()
方法。
下面是错误如何发生的示例。
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
在同一目录中有一个文件。
{"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()
方法。