JSON 对象必须是 str、bytes 或 bytearray,不能是 dict

目录

The JSON object must be str, bytes or bytearray, not dict

  1. JSON 对象必须是 str、bytes 或 bytearray,不能是 DICT
  2. JSON 对象必须是 str 或 bytes 而不是 TextIOWrapper
  3. JSON 对象必须是 str、bytes 或 bytearray,而不是 LIST
  4. JSON 对象必须是 str、bytes 或 bytearray 而不是 RESPONSE

确保根据您的错误消息单击正确的副标题

JSON对象必须是str、bytes或bytearray,不能是dict

当我们将字典传递给该方法时,会出现 Python“TypeError: the JSON object must be str, bytes or bytearray, not dict” json.loads()

要解决该错误,如果尝试将 dict 转换为 JSON 字符串,请删除对 的调用json.loads()并使用该
方法。
json.dumps()

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

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

主程序
import json my_dict = {'name': 'Bobby Hadz', 'age': 30} # ⛔️ TypeError: the JSON object must be str, bytes or bytearray, not dict result = json.loads(my_dict)

json.loads方法将 JSON 字符串解析为本机 Python 对象

由于我们已经有了一个原生的 Python 对象(字典),我们不能将它传递给方法json.loads()

将字典转换为 JSON 字符串

如果需要将字典转换为 JSON 字符串,请使用该json.dumps()
方法。

主程序
import json my_dict = {'name': 'Bobby Hadz', 'age': 30} my_json_str = json.dumps(my_dict) print(my_json_str) # 👉️ '{"name": "Bobby Hadz", "age": 30}' print(type(my_json_str)) # 👉️ <class 'str'>

json.dumps方法将 Python 对象转换为 JSON 格式字符串。

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

将 JSON 字符串转换为原生 Python 对象

如果需要将 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 本机对象(例如字典或列表)。

使用该json.load方法从 JSON 文件中读取

如果需要读取 JSON 文件,请使用该json.load()方法。

主程序
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(my_data['name']) # 👉️ 'Alice' print(type(my_data)) # 👉️ <class 'dict'>

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

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

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

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

open()如果您使用不带
with 语句的函数,这里是等效的示例

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

代码示例实现了相同的结果,但使用了

不带语句的
open() 函数with

with语句负责为我们自动关闭文件,但是当open()直接使用该函数时,我们必须手动关闭文件。

您可以将以下 Python 对象转换为 JSON

该类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

目录

  1. JSON 对象必须是 str 或 bytes 而不是 TextIOWrapper
  2. JSON 对象必须是 str、bytes 或 bytearray,而不是 LIST
  3. JSON 对象必须是 str、bytes 或 bytearray 而不是 RESPONSE

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

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

要解决该错误,请将文件对象传递给json.load()该方法。

Traceback (most recent call last): File "/home/borislav/Desktop/bobbyhadz_python/main.py", line 7, in <module> my_data = json.loads(f) ^^^^^^^^^^^^^ File "/usr/lib/python3.11/json/__init__.py", line 339, in loads raise TypeError(f'the JSON object must be str, bytes or bytearray, ' TypeError: the JSON object must be str, bytes or bytearray, not TextIOWrapper

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

主程序
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.load()方法反序列化一个JSON文件

我们不能将文件对象直接传递给该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()方法需要一个包含实现方法的 JSON 文档的文本文件或二进制文件.read()

手动调用file.read()方法json.loads()

或者,您手动调用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

目录

  1. JSON 对象必须是 str、bytes 或 bytearray,而不是 LIST
  2. JSON 对象必须是 str、bytes 或 bytearray 而不是 RESPONSE

JSON对象必须是str、bytes或bytearray,不能是list

The Python “TypeError: the JSON object must be str, bytes or bytearray, not
list” occurs when we pass a list to the json.loads() method.

To solve the error, remove the call to json.loads() and use the
json.dumps() method if trying to convert the list to a JSON string.

typeerror json object-must-be-str-bytes-or-bytearray-not-list

Here is an example of how the error occurs.

main.py
import json my_list = ['Alice', 'Bob', 'Carl'] # ⛔️ TypeError: the JSON object must be str, bytes or bytearray, not list result = json.loads(my_list)

The json.loads method parses a JSON
string into a native Python object.

Since we already have a native Python object (a list), we can’t pass it to the json.loads() method.

# Converting the list to a JSON string

If you need to convert a list to a JSON string, use the json.dumps() method.

main.py
import json my_list = ['Alice', 'Bob', 'Carl'] my_json_str = json.dumps(my_list) print(my_json_str) # 👉️ '["Alice", "Bob", "Carl"]' print(type(my_json_str)) # 👉️ <class 'str'>

The json.dumps method converts a Python
object to a JSON formatted string.

If you need to parse a JSON string to a native Python object, you have to use
the json.loads() method.

If you need to convert a Python object to a JSON string, you have to use the
json.dumps() method.

main.py
import json json_str = r'["Alice", "Bob", "Carl"]' my_list = json.loads(json_str) print(type(my_list)) # 👉️ <class 'list'> my_json_str = json.dumps(my_list) print(type(my_json_str)) # 👉️ <class 'str'>

The json.loads() method basically helps us load a Python native object (e.g. a
list or a dictionary) from a JSON string.

# Reading a list from a JSON file

If you need to read from a JSON file, use the json.load() method.

main.py
import json file_name = 'example.json' with open(file_name, 'r', encoding='utf-8') as f: my_data = json.load(f) print(my_data) # 👉️ ['Alice', 'Bob', 'Carl'] print(my_data[0]) # 👉️ 'Alice' print(type(my_data)) # 👉️ <class 'list'>

The code sample above assumes that you have an example.json file in the same
directory.

example.json
["Alice", "Bob", "Carl"]

The json.load method is
used to deserialize a file to a Python object, whereas the
json.loads method is used to
deserialize a JSON string to a Python object.

The json.load() method expects a text file or a binary file containing a JSON
document that implements a .read() method.

The JSONEncoder class supports the following objects and types by default.

Python JSON
dict object
list, tuple array
str string
int, float, int and float derived Enums number
True true
False false
None null

# Checking the type of a variable

If you aren’t sure what type of object a variable stores, use the built-in
type() class.

main.py
my_list = ['a', 'b', 'c'] print(type(my_list)) # 👉️ <class 'list'> print(isinstance(my_list, list)) # 👉️ True my_str = 'hello' print(type(my_str)) # 👉️ <class 'str'> print(isinstance(my_str, str)) # 👉️ True

The
type
class returns the type of an object.

The isinstance function returns
True if the passed-in object is an instance or a subclass of the passed-in
class.

# The JSON object must be str, bytes or bytearray not Response

The Python “TypeError: the JSON object must be str, bytes or bytearray, not
Response” occurs when we pass a Response object to the json.loads()
method.

To solve the error, call the json() method on the Response object instead,
e.g. result = res.json().

typeerror json object must be str bytes or bytearray 没有响应

Here is an example of how the error occurs.

main.py
import json import requests def make_request(): res = requests.get('https://reqres.in/api/users') # ⛔️ TypeError: the JSON object must be str, bytes or bytearray, not Response parsed = json.loads(res) make_request()

We passed a Response object to the json.loads() method which caused the
error.

# Use the json() method to parse the response

To solve the error, use the json() method on the response object instead.

main.py
import requests def make_request(): res = requests.get('https://reqres.in/api/users') # ✅ call .json() method on Response object parsed = res.json() print(parsed) print(type(parsed)) # 👉️ <class 'dict'> make_request()
We called the json() method on the Response object to parse it into a native Python object before accessing any of its keys.

You should use the json() method to parse the data from all requests, not just
HTTP GET.

# Making an HTTP Post request with the requests module

Here is an example of a POST request with the requests module.

main.py
import requests def make_request(): res = requests.post( 'https://reqres.in/api/users', data={'name': 'John Smith', 'job': 'manager'} ) # ✅ parse JSON response to native Python object data = res.json() # 👇️ {'name': 'John Smith', 'job': 'manager', 'id': '649', 'createdAt': '2022-05-20T10:11:23.939Z'} print(data) print(data['name']) # 👉️ "John Smith" print(data['job']) # 👉️ "manager" print(data['id']) # 649 make_request()

If you are working with a JSON string or a native Python object, make sure to
use the json.loads() and json.dumps() methods.

If you need to parse a JSON string to a native Python object, you have to use
the json.loads() method.

If you need to convert a Python object into a JSON string, you have to use the
json.dumps() method.

main.py
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'>

The json.loads() method basically helps us load a Python native object (e.g. a
dictionary or a list) from a JSON string.

The json.dumps method converts a Python
object to a JSON formatted string.

The JSONEncoder class supports the following objects and types by default.

Python JSON
dict object
列表,元组 大批
海峡 细绳
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