web-dev-qa-db-ja.com

マップオブジェクトはJSONシリアル化できません

これは、Django 1.7。で追加され、_json.dumps_のラッパーであるJSONResponseを返すときに発生します。ただし、この場合、エラーが発生します。データが正しく、Pythonシェルを介してJSONにシリアル化できると確信しています。

データをJSONにシリアル化する正しい方法は何ですか?

_from Django.http import JsonResponse
from collections import OrderedDict

data = OrderedDict([('doc', '546546545'), ('order', '98745'), ('nothing', '0.0')])

return JsonResponse(data) # doesn't work, JSONRenderer().render(data) works
_

このエラーが発生します:

_<map object at 0x7fa3435f3048> is not JSON serializable
_

print(data)は以下を提供します:

OrderedDict([('doc', '546546545'), ('order', '98745'), ('nothing', '0.0')])

12
Peter G.

map() in Python 3はジェネレーター関数であり、JSONではシリアル化できません。リストに変換することでシリアル化できます。

from Django.http import JsonResponse
from collections import OrderedDict

def order(request):    
    bunch = OrderSerializer(Order.objects.all(), many=True)
    headers = bunch.data[0].keys()
    # consume the generator and convert it to a list here
    headers_prepared = list(map(lambda x: {'data': x} , headers))
    ordered_all = (('columns', headers_prepared), ('lines', bunch.data))
    data = OrderedDict(ordered_all)
    return JsonResponse(data)
25
knbk