如何格式化JSON字节数组并写入文件?解决解码与序列化报错
问题解决思路与代码修正
核心问题分析
- 解码报错
UnicodeDecodeError:解密后的bytearray包含非UTF-8字节(0x8b是gzip压缩头的特征字节),说明这不是纯文本数据,强行用UTF-8解码必然失败。 - 序列化报错
TypeError:JSON规范不支持直接序列化bytearray类型,必须先转换为JSON兼容的类型(比如字符串)。
解决方案:二进制数据转Base64编码
因为你的数据是二进制格式,最稳妥的方式是用Base64编码把二进制转成可序列化的字符串,再写入格式化后的JSON文件。
修正后的代码
import json import base64 content = bytearray() content_idx = 0 try: with open(arguments.input_file, 'rb') as input_file: while (byte := input_file.read(1)): content += bytes([ord(byte) ^ xor_key[content_idx % len(xor_key)]]) content_idx += 1 except (IOError, OSError) as exception: print('Error: could not read input file') exit() try: # 将bytearray转成Base64字符串 base64_content = base64.b64encode(content).decode('utf-8') # 生成格式化的JSON字符串 formatted_json = json.dumps({"data": base64_content}, indent=4) # 以文本模式写入文件(注意用'w'而非'wb') with open(arguments.output_file, 'w', encoding='utf-8') as output_file: output_file.write(formatted_json) except (IOError, OSError) as exception: print('Error: could not create output file') exit()
关键改动说明
- 引入base64模块:用于二进制数据和字符串的双向转换,Base64编码后的字符串是纯ASCII,可安全嵌入JSON。
- 替换解码逻辑:不再尝试用UTF-8解码二进制数据,而是用
base64.b64encode(content)把bytearray转成bytes,再用UTF-8解码为字符串。 - JSON结构调整:把Base64字符串放在一个键值对中(比如
{"data": "..."}),让JSON结构更规范,也方便后续解析。 - 文件写入模式:改用文本模式
'w'写入格式化后的JSON字符串,避免二进制写入导致的编码问题。
备选方案:如果数据是特定编码文本
如果确认解密后是其他编码的文本(比如latin-1),可以替换解码方式:
# 替换base64编码部分为对应解码 text_content = content.decode('latin-1') formatted_json = json.dumps({"data": text_content}, indent=4)
但这种方式只适用于确定文本编码的场景,二进制数据用Base64是通用解决方案。
内容的提问来源于stack exchange,提问作者Kyle Z
相关产品推荐
相关产品推荐

