有没有一种方法可以格式化json字节数组并将其写入文件



我制作了一个字节数组,并将其写入json文件。这是可行的,但我希望有一个格式化的JSON文件,而不是一堵巨大的文本墙。

我尝试过用utf-8解码字节数组,但我得到了UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte。我的计划是取这个字符串并使用json.dumps()对其进行格式化。

在没有任何其他格式的情况下尝试json.dumps()会得到以下结果:TypeError: Object of type bytearray is not JSON serializable

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:
with open(arguments.output_file, 'wb') as output_file:
output_file.write(json.dumps(content.decode('utf-8'), indent=4))
except (IOError, OSError) as exception:
print('Error: could not create output file')
exit()

错误是您试图传递then字节,而json.dumps()试图以某种方式序列化它们,但不能,这写在错误输出中。

要将文件保存为JSON,您需要将字节流转换为Python字典,该字典已经完全接受JSON,不会出现任何问题。

如果您可以显示输入数据的样子以及希望保存到JSON 中的内容,这将有所帮助

Python有一个现成的Base64库,它可以将字节数组转换为字符串,下面是一篇用法文章的示例。但是稍后在将该字符串解析到字典中时可能会出现问题,所以我建议您在谷歌上搜索哪些库可能已经准备好进行此类解析,但除此之外,您可以使用正则表达式

JSON编码器和解码器可以扩展以支持其他类型。这里有一种支持字节字符串的方法,将它们转换为BASE64str,并用特殊密钥将其序列化为dict。密钥用于标记解码器,以将具有该密钥的JSON对象转换回字节字符串。

import json
import base64
class B64Encoder(json.JSONEncoder):
'''Recognize a bytes object and return a dictionary with
a special key to indicate its value is a BASE64 string.
'''
def default(self, obj):
if isinstance(obj, bytes):
return {'__B64__': base64.b64encode(obj).decode('ascii')}
return super().default(obj)
def B64Decoder(obj):
'''Recognize a dictionary with the special BASE64 key
and return its BASE64-decoded value.
'''
if '__B64__' in obj:
return base64.b64decode(obj['__B64__'])
return obj
d = {'key1': bytes.fromhex('0102030405'), 'key2': b'xaax55x00xff'}
print(f'Python IN: {d}')
print('nJSON:')
s = json.dumps(d, indent=2, cls=B64Encoder)
print(s)
d2 = json.loads(s, object_hook=B64Decoder)
print(f'nPython OUT: {d}')

输出:

Python IN: {'key1': b'x01x02x03x04x05', 'key2': b'xaaUx00xff'}
JSON:
{
"key1": {
"__B64__": "AQIDBAU="
},
"key2": {
"__B64__": "qlUA/w=="
}
}
Python OUT: {'key1': b'x01x02x03x04x05', 'key2': b'xaaUx00xff'}

最新更新