有没有办法格式化json字节数组并将其写入文件?

lyfkaqu1  于 2022-12-05  发布在  其他
关注(0)|答案(2)|浏览(96)

我做了一个字节数组,并将其写入到一个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()
zfycwa2u

zfycwa2u1#

错误是您试图传递then字节,而json.dumps()试图以某种方式将它们序列化,但不能,这被写入错误输出中。
要将文件保存为JSON格式,需要将字节流转换为Python字典,该字典已经完全接受JSON,没有任何问题。
如果您可以显示输入数据的外观以及要保存到JSON的内容,这将有所帮助
Python有一个现成的Base64库,它可以将字节数组转换为字符串,还有here's an example usage article。但是,当将字符串解析到字典中时,问题可能会出现,所以我建议您搜索一下有哪些库可以进行这种解析,否则您可以使用正则表达式

abithluo

abithluo2#

JSON编码器和解码器可以扩展为支持其他类型。这里有一种支持字节字符串的方法,将其转换为BASE64 str,并使用特殊键将其序列化为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'\xaa\x55\x00\xff'}
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'\x01\x02\x03\x04\x05', 'key2': b'\xaaU\x00\xff'}

JSON:
{
  "key1": {
    "__B64__": "AQIDBAU="
  },
  "key2": {
    "__B64__": "qlUA/w=="
  }
}

Python OUT: {'key1': b'\x01\x02\x03\x04\x05', 'key2': b'\xaaU\x00\xff'}

相关问题