serialize - Serializar en JSON una base de datos codificados 64
newtonsoft json serialize c# (1)
Estoy escribiendo un script para automatizar la generación de datos para una demostración y necesito serializar en un JSON algunos datos. Parte de estos datos es una imagen, así que la codifiqué en base64, pero cuando intento ejecutar mi script obtengo:
Traceback (most recent call last):
File "lazyAutomationScript.py", line 113, in <module>
json.dump(out_dict, outfile)
File "/usr/lib/python3.4/json/__init__.py", line 178, in dump
for chunk in iterable:
File "/usr/lib/python3.4/json/encoder.py", line 422, in _iterencode
yield from _iterencode_dict(o, _current_indent_level)
File "/usr/lib/python3.4/json/encoder.py", line 396, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.4/json/encoder.py", line 396, in _iterencode_dict
yield from chunks
File "/usr/lib/python3.4/json/encoder.py", line 429, in _iterencode
o = _default(o)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: b''iVBORw0KGgoAAAANSUhEUgAADWcAABRACAYAAABf7ZytAAAABGdB...
...
BF2jhLaJNmRwAAAAAElFTkSuQmCC'' is not JSON serializable
Por lo que sé, una base64 codificada-lo que sea (una imagen PNG, en este caso) es solo una cadena, por lo que debería plantear un problema para serializar. ¿Qué me estoy perdiendo?
Debes tener cuidado con los tipos de datos.
Si lees una imagen binaria, obtienes bytes. Si codificas estos bytes en base64, obtienes ... bytes de nuevo! (ver documentación en b64encode )
json no puede manejar bytes en bruto, es por eso que recibe el error.
Acabo de escribir un ejemplo, con comentarios, espero que ayude:
from base64 import b64encode
from json import dumps
ENCODING = ''utf-8''
IMAGE_NAME = ''spam.jpg''
JSON_NAME = ''output.json''
# first: reading the binary stuff
# note the ''rb'' flag
# result: bytes
with open(IMAGE_NAME, ''rb'') as open_file:
byte_content = open_file.read()
# second: base64 encode read data
# result: bytes (again)
base64_bytes = b64encode(byte_content)
# third: decode these bytes to text
# result: string (in utf-8)
base64_string = base64_bytes.decode(ENCODING)
# optional: doing stuff with the data
# result here: some dict
raw_data = {IMAGE_NAME: base64_string}
# now: encoding the data to json
# result: string
json_data = dumps(raw_data, indent=2)
# finally: writing the json string to disk
# note the ''w'' flag, no ''b'' needed as we deal with text here
with open(JSON_NAME, ''w'') as another_open_file:
another_open_file.write(json_data)