serializeobject serialize serializar newtonsoft net jsonconvert example deserializeobject deserialize deserializar json python-3.x serialization base64

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)