Estoy usando json.dump() y json.load() para guardar/leer un diccionario de cadenas en/desde el disco. El problema es que no puedo tener ninguna de las cadenas en Unicode. Parecen estar en Unicode, sin importar cómo configuro los parámetros para volcar/cargar (incluyendo Ensure_ascii y codificación).Forzar el módulo Python json para que funcione con ASCII
15
A
Respuesta
20
Si sólo están tratando con objetos JSON simples, usted puede utilizar el siguiente:
def ascii_encode_dict(data):
ascii_encode = lambda x: x.encode('ascii')
return dict(map(ascii_encode, pair) for pair in data.items())
json.loads(json_data, object_hook=ascii_encode_dict)
Aquí es un ejemplo de cómo funciona:
>>> json_data = '{"foo": "bar", "bar": "baz"}'
>>> json.loads(json_data) # old call gives unicode
{u'foo': u'bar', u'bar': u'baz'}
>>> json.loads(json_data, object_hook=ascii_encode_dict) # new call gives str
{'foo': 'bar', 'bar': 'baz'}
This answer obras para una más compleja JSON estructura, y da una buena explicación sobre el parámetro object_hook
. También hay otra respuesta que toma recursivamente el resultado de una llamada json.loads()
y convierte todas las cadenas Unicode en cadenas de bytes.
11
Y si el objeto JSON es una mezcla de tipos de datos, no sólo las cadenas Unicode, se puede utilizar esta expresión:
def ascii_encode_dict(data):
ascii_encode = lambda x: x.encode('ascii') if isinstance(x, unicode) else x
return dict(map(ascii_encode, pair) for pair in data.items())
Cuestiones relacionadas
- 1. Cambiar PyScripter para que funcione con diferentes versiones de Python
- 2. Configurar Erlang para que funcione con SSL
- 3. Flotador de formato con módulo json estándar
- 4. ¿Hay un módulo para python que reconozca el rostro?
- 5. Cómo forzar al bastidor para que funcione alrededor del error habitual "Ya has activado el bastidor ..."?
- 6. ¿Cómo hacer que mi módulo de extensión SWIG funcione con Pickle?
- 7. Módulo SSH para python
- 8. Haciendo que ActivePython funcione con WSH
- 9. módulo python para nslookup
- 10. ¿Qué debo hacer para que Hash.from_xml() funcione?
- 11. Google App Engine: módulo JSON
- 12. Módulo de Python para plister binario
- 13. Proxies con el módulo 'Solicitudes' de Python
- 14. Forzar el uso de python de una versión anterior del módulo (que lo que tengo instalado ahora)
- 15. paginación con el módulo python cmd
- 16. ¿Cómo usar el módulo win32gui con Python?
- 17. ¿Dónde encontrar el módulo win32api para Python?
- 18. Crunching json con python
- 19. ¿Qué módulo JSON puedo usar en Python 2.5?
- 20. ¿Gran uso de memoria del módulo json de Python?
- 21. Módulo Python para el marcado wiki
- 22. electrónico Codificación sujeto (SMTP) en Python con caracteres no ASCII
- 23. Gráfico ASCII de Python Dibujo
- 24. ¿Cómo hacer que Django slugify funcione correctamente con cadenas Unicode?
- 25. ¿Cómo creo una interfaz ASCII con marco estático en Python?
- 26. Cómo configurar Ninject para que funcione con ServiceStack.net
- 27. Configurar Qt Creator para que funcione con GDB
- 28. Eclipse necesita reiniciarse con frecuencia para que Logcat funcione correctamente
- 29. Cómo configuro Git en Xcode para que funcione con BitBucket
- 30. Problemas para conseguir que Rails 3 funcione con MySQL
favor publicar su código actual y los mensajes de error que está recibiendo. Gracias. – bernie
¿Qué quiere decir con "en Unicode"? ¿Estás hablando del escape de caracteres no ASCII a escapes '\ u1234'? Si es así, ¿por qué esta codificación no es aceptable? Es JSON perfectamente válido que cualquier analizador debe aceptar; hay caracteres que * deben * estar codificados en este formato incluso si, en general, está dejando caracteres no ASCII sin guardar. – bobince
Porque JSON es de forma nativa formato utf-8. Python's json.loads() acepta símbolos no ascii y los analiza en cadenas Unicode. jsob.loads() analiza todas las cadenas en el tipo de Python 'unicode', no 'str'. ¡Pero json.dumps() escapa ** todos los ** símbolos no ascii! Entonces, string! = Json.dumps (json.loads (string)) –