字节对象列表转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 捕获 UnicodeDecodeErrorJSONDecodeError

根据你的实际数据结构选择合适方案!

posted @ 2025-05-15 17:56  Haloiwuhan  阅读(63)  评论(0)    收藏  举报