Simplejson django dict给了我一个错误

时间:2014-06-26 20:53:37

标签: python json django

我有以下django词典 -

titles_to_update = Title.objects.exclude(
                                             error_message__startswith="No"
                                        ).filter(
                                             is_successful=False,
                                             updatebatch__is_completed=False
                                        ).values(
                                            'id',
                                            'apple_id',
                                            'promotion_start_date',
                                            'promotion_end_date',
                                            'sd_price_tier',
                                            'hd_price_tier'
                                        )

# {'hd_price_tier': 101, 'sd_price_tier': 2, 'apple_id': 270201401L, 
   'promotion_start_date': datetime.date(2014, 6, 27), 'id': 25332L, 
   'promotion_end_date': datetime.date(2014, 6, 30)}...]

return HttpResponse(simplejson.dumps(titles_to_update))

这给了我错误:

[my object] is not JSON serializable

我需要做什么才能在json中对dict进行编码?

2 个答案:

答案 0 :(得分:0)

开箱即用,simplejson编码器only supports some simple python objects:

Python              JSON
----------------------------
dict, namedtuple -> object
list, tuple      -> array 
str, unicode     -> string
int, long, float -> number
True             -> true
False            -> false
None             -> null

可以将函数传递给json.dumps()作为default参数in order to handle other objects:

>>> import simplejson as json
>>> def encode_complex(obj):
...     if isinstance(obj, complex):
...         return [obj.real, obj.imag]
...     raise TypeError(repr(o) + " is not JSON serializable")
...
>>> json.dumps(2 + 1j, default=encode_complex)
'[2.0, 1.0]'
>>> json.JSONEncoder(default=encode_complex).encode(2 + 1j)
'[2.0, 1.0]'
>>> ''.join(json.JSONEncoder(default=encode_complex).iterencode(2 + 1j))
'[2.0, 1.0]'

但在你的情况下,Django already provides tools to help you serialize its objects,所以使用这些可能是推荐的方法。

from django.core import serializers
...
as_json = serializers.serialize("json", titles_to_update)
return HTTPResponse(as_json, content_type="application/json")

答案 1 :(得分:0)

这是我编写的一个简单函数,用于将datetime对象转换为可与simplejson一起使用的函数:

def make_query_dict_jsonable(query_dict):
    list_of_objects = []
    for item in query_dict:
        data = {}
        for field_name in title.keys():
            data[field_name] = str(item[field_name])
        list_of_objects.append(data)

    return list_of_objects