字节对象列表转json
在 Python 中,将字节对象列表(List[bytes])转换为 JSON 格式的数据,需要先解码字节为字符串,再处理为合法的 JSON 结构。以下是几种常见场景的解决方案:
1. 列表中的每个字节对象都是独立的 JSON
如果列表中的每个 bytes 元素都是一个完整的 JSON 字符串:
import json
byte_list = [
b'{"name": "Alice", "age": 30}',
b'{"name": "Bob", "age": 25}'
]
# 方法1:逐个解码并解析为JSON对象
json_list = [json.loads(byte_item.decode('utf-8')) for byte_item in byte_list]
print(json_list)
# 输出: [{'name': 'Alice', 'age': 30}, {'name': 'Bob', 'age': 25}]
# 方法2:转换为JSON字符串
json_str = json.dumps(json_list)
print(json_str) # 输出: [{"name": "Alice", "age": 30}, {"name": "Bob", "age": 25}]
2. 列表中的字节对象拼接后组成完整 JSON
如果所有字节对象拼接后是一个完整的 JSON(如分块传输的数据):
byte_list = [
b'{"users": [',
b'{"name": "Alice"},',
b'{"name": "Bob"}]}'
]
# 拼接字节并解码
combined_bytes = b''.join(byte_list)
json_data = json.loads(combined_bytes.decode('utf-8'))
print(json_data)
# 输出: {'users': [{'name': 'Alice'}, {'name': 'Bob'}]}
3. 字节对象列表本身需要转为 JSON 数组
如果目标是直接将字节列表转为 JSON 数组(不解析内部内容):
byte_list = [b'foo', b'bar', b'123']
# 先解码为字符串列表
str_list = [item.decode('utf-8') for item in byte_list]
# 再转为JSON
json_str = json.dumps(str_list)
print(json_str) # 输出: ["foo", "bar", "123"]
4. 处理非UTF-8编码的字节
如果字节使用其他编码(如 gbk):
byte_list = [
b'{"name": "\xc0\xee\xc0\xf6"}', # GBK编码的"李丽"
b'{"name": "\xcd\xf5\xce\xf7"}' # GBK编码的"王西"
]
# 指定编码解码
json_list = [json.loads(item.decode('gbk')) for item in byte_list]
print(json_list) # 输出: [{'name': '李丽'}, {'name': '王西'}]
5. 错误处理
防止非法JSON或解码失败:
byte_list = [
b'{"valid": "data"}',
b'invalid json',
b'{"another": "item"}'
]
result = []
for byte_item in byte_list:
try:
decoded = byte_item.decode('utf-8')
result.append(json.loads(decoded))
except (UnicodeDecodeError, json.JSONDecodeError) as e:
print(f"解析失败: {e}, 原始数据: {byte_item}")
print(result) # 输出: [{'valid': 'data'}, {'another': 'item'}]
总结
| 场景 | 方法 | 关键代码 |
|---|---|---|
| 每个字节是独立JSON | 列表推导式 + json.loads |
[json.loads(b.decode()) for b in byte_list] |
| 拼接后是完整JSON | b''.join() + 解码 |
json.loads(b''.join(byte_list).decode()) |
| 直接转字符串数组 | 解码后 json.dumps |
json.dumps([b.decode() for b in byte_list]) |
| 非UTF-8编码 | 指定编码解码 | byte_item.decode('gbk') |
| 容错处理 | try-except |
捕获 UnicodeDecodeError 和 JSONDecodeError |
根据你的实际数据结构选择合适方案!

浙公网安备 33010602011771号