Python中如何将带有二进制数据的list转换为JSON载荷?

现在有一个 1400 字节的二进制数据的 list,形式类似[[b']', b'Y', b']', b'Y', b'\'],直接使用 josn.dumps()的话会提示 TypeError: b'' is not JSON serializable,list 不能使用 decode 和 encode,而使用 bytes()和 str()又会破坏原来的字节长度变成 10000 多字节了,而且原本分开的两个字节会黏连成一个 utf-8 字符,请问如何在不改变字节长度的情况下将该 list 放入 json 的载荷呢?


Python中如何将带有二进制数据的list转换为JSON载荷?

15 回复

b 是用来标识 byte 的意思吗? JSON 的 value 存储的类型只有 string,number,object,array,true,false,null 这几种,具体参考 json.org 。并不能直接直接存二进制。两种思路 1.按 number 存,存对应的 ASCII 码; 2.按字符串存


import json
import base64

def list_to_json_with_binary(data_list):
    """
    将包含二进制数据的列表转换为JSON可序列化的格式
    使用base64编码处理二进制数据
    """
    processed_list = []
    
    for item in data_list:
        if isinstance(item, bytes):
            # 将二进制数据转换为base64字符串
            encoded = base64.b64encode(item).decode('utf-8')
            processed_list.append({
                '_type': 'bytes',
                'data': encoded
            })
        else:
            # 其他类型数据保持原样
            processed_list.append(item)
    
    return json.dumps(processed_list)

def json_to_list_with_binary(json_str):
    """
    将JSON字符串转换回包含二进制数据的列表
    """
    data_list = json.loads(json_str)
    result_list = []
    
    for item in data_list:
        if isinstance(item, dict) and item.get('_type') == 'bytes':
            # 解码base64字符串回二进制数据
            decoded = base64.b64decode(item['data'])
            result_list.append(decoded)
        else:
            result_list.append(item)
    
    return result_list

# 使用示例
if __name__ == "__main__":
    # 原始数据:包含字符串、整数和二进制数据
    original_list = [
        "hello",
        42,
        b'\x89PNG\r\n\x1a\n',  # PNG文件头
        b'\xff\xd8\xff\xe0',    # JPEG文件头
        {"key": "value"}
    ]
    
    print("原始列表:", original_list)
    
    # 转换为JSON字符串
    json_str = list_to_json_with_binary(original_list)
    print("\nJSON字符串:", json_str)
    
    # 转换回列表
    restored_list = json_to_list_with_binary(json_str)
    print("\n恢复的列表:", restored_list)
    
    # 验证二进制数据是否一致
    for i, (orig, rest) in enumerate(zip(original_list, restored_list)):
        if isinstance(orig, bytes):
            print(f"索引{i}的二进制数据一致: {orig == rest}")

核心要点:

  1. JSON本身不支持二进制数据,需要先编码(如base64)
  2. 编码时添加类型标记,解码时能正确识别
  3. 保持其他数据类型的正常序列化

建议: 用base64编码二进制数据,加类型标记方便解码。

[载荷] 是什么?

是说怎么把 [[b']', b'Y', b']', b'Y', b'\'] 这玩意儿转成 JSON 格式吗?

b64 一下啊

一般要保存二进制数据就是存 base64 字符串,缺点就是会长三分之一。

楼主问题描述有问题。
一个 1400 字节的二进制数据的 list,形式类似[[b’]’, b’Y’, b’]’, b’Y’, b’’]
[[b’]’, b’Y’, b’]’, b’Y’, b’’] 这个是个 bytes 组成的 list,并不是二进制数据。
在 pyton 中二进制数据是长成下面这样的。

[0b1110, 0b10, 0b11, 0b1011101]

存 ASCII 码,输出转换

按字符串存会变成 utf 编码,然后有些原来两个相邻的字节就变成一个 utf 字符了。不便于后续处理

是的,意思差不多


我试了,列表好像不支持 base64

确实说错了,主要这个原来是示波器读取的二进制波形数据,但是在 python 的函数里变成 bytes 的 list 了,然后固有印象就说错了

常用做法是 base64
’’.join() 就是 bytes 了,就可以 base64 了

自己写一个 JSON 的转换函数,手册里有

如果一定要直接用 json 存的话,base64 吧,最好是把这个 list 变成整个 bytes 再处理,会方便一些。不过这种其实用 protobuf 之类的会方便很多啊

先合并成一个 bytes,然后在 base64 转成字符串。

回到顶部