json.dump no puede serializar un diccionario que contiene una lista en python

Tengo esta parte [{'scenariotestinputid': 1, 'scenarioid_id': 1, 'testinputid_id': 1}] dentro de un diccionario de python llamado resultado. Cuando llamo a json.dumps(result), aparece un TypeError que dice que [{'scenariotestinputid': 1, 'scenarioid_id': 1, 'testinputid_id': 1}] no es JSON serializable. ¿Alguien puede explicar por qué?

Edit1: el contenido completo del diccionario de "resultados" es:

result: {'scenarios': [{'inputs': [{'scenariotestinputid': 1, 'scenarioid_    id': 1, 'testinputid_id': 1}], 'scenarioid': 1, 'scenarioname': u'Default Scenario', 'testid_id': 1, 'isdefault': 1}, {'inputs': [], 'scenarioid': 2, 'scenarioname': u'Scenario-1', 'testid_id': 1, 'isdefault': 0}], 'status': 'success'}

El código que estoy usando es:

if x == y:
    scenarios_list = Scenario.objects.filter(testid=testcase).order_by("scenarioname")
    scenarios_dict_list = []
    for scenario in scenarios_list:                                            
        scenario_inputs = scenario.scenariotestinput_set.values()
        scenario_dict = scenario.__dict__
        del scenario_dict['_state']
        scenario_dict['inputs'] = scenario_inputs            
        scenarios_dict_list.append(scenario_dict)
        result['scenarios'] = scenarios_dict_list
result['status'] = "success"
return HttpResponse(json.dumps(result), content_type="application/json")

dentro de una función

Edit2: El rastreo es el siguiente:

(Pdb) 
> /opt/my_apps/cpr_proj/cpr/views.py(512)set_benchmark_metrics_dispatcher()
-> return HttpResponse(json.dumps(result), content_type="application/json")
(Pdb) 
TypeError: TypeErro...izable",)
> /opt/my_apps/cpr_proj/cpr/views.py(512)set_benchmark_metrics_dispatcher()
-> return HttpResponse(json.dumps(result), content_type="application/json")
(Pdb) bt
  /opt/Python-2.7.3/Lib/threading.py(524)__bootstrap()
-> self.__bootstrap_inner()
  /opt/Python-2.7.3/Lib/threading.py(551)__bootstrap_inner()
-> self.run()
  /opt/Python-2.7.3/Lib/threading.py(504)run()
-> self.__target(*self.__args, **self.__kwargs)
  /opt/Python-2.7.3/Lib/SocketServer.py(582)process_request_thread()
-> self.finish_request(request, client_address)
  /opt/Python-2.7.3/Lib/SocketServer.py(323)finish_request()
-> self.RequestHandlerClass(request, client_address, self)
  /usr/local/lib/python2.7/site-packages/django/core/servers/basehttp.py(139)__init__()
-> super(WSGIRequestHandler, self).__init__(*args, **kwargs)
  /opt/Python-2.7.3/Lib/SocketServer.py(638)__init__()
-> self.handle()
  /opt/Python-2.7.3/Lib/wsgiref/simple_server.py(124)handle()
-> handler.run(self.server.get_app())
  /opt/Python-2.7.3/Lib/wsgiref/handlers.py(85)run()
-> self.result = application(self.environ, self.start_response)
  /usr/local/lib/python2.7/site-packages/django/contrib/staticfiles/handlers.py(67)__call__()
-> return self.application(environ, start_response)
  /usr/local/lib/python2.7/site-packages/django/core/handlers/wsgi.py(241)__call__()
-> response = self.get_response(request)
  /usr/local/lib/python2.7/site-packages/django/core/handlers/base.py(111)get_response()
-> response = callback(request, *callback_args, **callback_kwargs)
> /opt/my_apps/cpr_proj/cpr/views.py(512)set_benchmark_metrics_dispatcher()
-> return HttpResponse(json.dumps(result), content_type="application/json")
  /opt/Python-2.7.3/Lib/json/__init__.py(231)dumps()
-> return _default_encoder.encode(obj)
  /opt/Python-2.7.3/Lib/json/encoder.py(201)encode()
-> chunks = self.iterencode(o, _one_shot=True)
  /opt/Python-2.7.3/Lib/json/encoder.py(264)iterencode()
-> return _iterencode(o, 0)
  /opt/Python-2.7.3/Lib/json/encoder.py(178)default()
-> raise TypeError(repr(o) + " is not JSON serializable")

preguntado el 08 de marzo de 13 a las 21:03

Funciona para mi. ¿Puede proporcionar un programa completo que falle? Ver sscce.org -

Eso descarga muy bien, resultado: '[{"scenariotestinputid": 1, "scenarioid_id": 1, "testinputid_id": 1}]'. ¿Puede proporcionar un rastreo? -

Es posible que result no es en realidad un dict, pero algo dict-¿me gusta? O eso result[x] no es un list pero algo list-¿me gusta? O eso result[x][0] no es un dict ...? -

Actualicé con más información sobre cómo se hace. Espero que sea más fácil de solucionar. -

El error no nos dice nada, lamentablemente. Veo que tiene una sesión PDB activa; Que hace type(result) antes el json.dumps() llamar para decirte que es? Puede intentar seleccionar índices individuales de result y probarlos para su type(), Si json.dumps() en el trabajo de valores individuales, etc.-

1 Respuestas

La salida de values() sigue siendo un objeto QuerySet, porque le permite encadenar otros métodos después de él. Cuando haya terminado de agregar opciones, debe "renderizarlo" en una lista adecuada:

scenario_inputs = list(scenario.scenariotestinput_set.values())

respondido 08 mar '13, 23:03

Muy bien, muchas gracias al Sr. Tobia, esa fue la respuesta correcta :) - hombre araña

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.