You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化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()

关键改动说明

  1. 引入base64模块:用于二进制数据和字符串的双向转换,Base64编码后的字符串是纯ASCII,可安全嵌入JSON。
  2. 替换解码逻辑:不再尝试用UTF-8解码二进制数据,而是用base64.b64encode(content)把bytearray转成bytes,再用UTF-8解码为字符串。
  3. JSON结构调整:把Base64字符串放在一个键值对中(比如{"data": "..."}),让JSON结构更规范,也方便后续解析。
  4. 文件写入模式:改用文本模式'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:15:57