2010-12-31 18 views
19

Tengo solución de problemas de algunos códigos que usan HTTP POST para enviar datos y deben devolver un resultado JSON cuyos contenidos son un diccionario. Estoy usando un contenedor XML-RPC para exponer este servicio. Cuando la envoltura recibe la información dict de la variable de respuesta HTTP, el contenido dict están en una cadena en esta forma:Python dict a JSON a través de json.loads:

{'created': datetime.datetime(2010, 12, 31, 19, 13, 8, 379909), 'worker': u'GoogleWorker', 'ready': False, 'request_id': '8f1381853a444a42a37ae5152a3af947', 'owner': u'admin', 'shortname': u'test19'} 

Estoy tratando de convertir la cadena a continuación en un resultado JSON mediante la siguiente instrucción:

result = json.loads(response[1]) 

sin embargo, cuando intento utilizar json.loads para convertir los datos a JSON, me sale el siguiente error: Fault: <Fault 1: "<type 'exceptions.ValueError'>:Expecting property name: line 1 column 1 (char 1)">

me trataron de forma manual para convertir la cadena de arriba para JSON, pero me da la misma error. Es el dict malformado de alguna manera? ¿Es debido a unicode? También intenté configurar la configuración regional para UTF-8, pero no fue exitosa.

Cualquier ayuda sería muy apreciada.

+0

Gracias a todos por su ayuda. Me di cuenta de que estoy haciendo la pregunta incorrecta, ya que estoy tratando de depurar una API que me envió y que usa django-piston y no la he usado antes. Mi pregunta real está relacionada con django-piston y por qué el tipo de contenido de mi respuesta siempre se estableció en texto plano en lugar de application/json cuando la respuesta es HTTP CREATED (201). Preguntaré esto como una pregunta separada, ya que la pregunta original es irrelevante para el problema real (¡aunque las respuestas sobre el comportamiento de JSON son interesantes!). –

Respuesta

31

que están tratando de utilizar el método equivocado. json.loads es para cargando JSON a Python. Si desea convertir Python a JSON, necesita json.dumps.

result = json.dumps(response[1]) 
+0

Lo había descubierto antes, pero después de ver todo mi código con más detalle, me di cuenta de que estaba haciendo una pregunta incorrecta. Mi pregunta está relacionada con django-piston y por qué el tipo de contenido de mi respuesta siempre se estableció en texto plano en lugar de application/json cuando la respuesta es HTTP CREATED (201). Haré esto como una pregunta separada. –

+1

Esto me da un error: "NestedMultiDict no es json serializable" – zakdances

5

Ese dict está en formato literal dict de Python, no JSON. Usted puede hacer:

import ast 
result = ast.literal_eval(response[1]) 

para leer en la respuesta en ese formato. ¿Estás seguro de que Django aún no ha decodificado JSON la respuesta?

+2

literal_eval no funcionará en objetos datetime. Pero sospecho que tienes razón en que algo más ya está analizando. –

1

que tengo uso de JSON en Django, yo uso esto:

import simplejson as json 
#to encode 
final= {'first':first_data,'second':second_data} 
json.dumps(final) 
#to decode this is the example from python's api 
json.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')