构建字典字典并将其输出为json

时间:2015-02-02 06:38:24

标签: python django python-2.7

我有以下结构作为列表(最初作为django ORM的结果集返回):

{'valuex': 65.92, 'day': datetime.date(2014, 10, 15), 'valuey': 74}{'valuex': 58.55, 'day': datetime.date(2014, 10, 16), 'valuey': 61}

我想将其转换(并输出)为以下json:

{
'2014-10-15' : { 'valuex': 65.92, 'day': datetime.date(2014, 10, 15), 'valuey': 74 }, 
'2014-10-16' : { 'valuex': 58.55, 'day': datetime.date(2014, 10, 16), 'valuey': 61 }
}

我认为这将是一件微不足道的事情:

ret = {}
for r in results:
    ret[r.get('day')] = r

然后输出到json可以由Django(@render_to_json)完成 但这实际上只返回没有相应字典的日期。

我是Python的新手,我迷失在这里。

更新:

我发现实际的问题是Django没有将我的结构输出为json。上面的脚本实际上确实创建了我想要实现的结构。但是django无法将其转换为json。这样做是否安全:

return HttpResponse(str(ret))

代替?或者是否有某种方法可以将其呈现为正确的json(json.dumps具有相同的问题)。

UPDATE2: 好吧,json.dumps(ret)对我有用,只需要摆脱日期时间对象,因为它不是json seralizeable。

3 个答案:

答案 0 :(得分:0)

import datetime

results = [{'valuex': 65.92, 'day': datetime.date(2014, 10, 15), 'valuey': 74}, {'valuex': 58.55, 'day': datetime.date(2014, 10, 16), 'valuey': 61}]

ret = {}
for r in results:
    ret.update({str(r['day']): r})

print ret
{'2014-10-16': {'day': datetime.date(2014, 10, 16), 'valuey': 61, 'valuex': 58.55}, '2014-10-15': {'day': datetime.date(2014, 10, 15), 'valuey': 74, 'valuex': 65.92}}

答案 1 :(得分:0)

解决方案#1

return HttpResponse(json.dumps({'result': 'done'}), content_type='application/json')

解决方案#2

class JSONResponse(HttpResponse):

    """
    An HttpResponse that renders its content into JSON.
    """
def __init__(self, data, **kwargs):
    content = simplejson.dumps(data)
    kwargs['content_type'] = 'application/json'
    super(JSONResponse, self).__init__(content, **kwargs)

在视图中而不是HttpResponse写

data = {'success': True}
return JSONResponse(data)

关于datetime,您需要使用

将datetime对象转换为字符串
my_datetime.strftime('<format>')

并在你的词典中使用它。

答案 2 :(得分:0)

import datetime

d1 = [{'valuex': 65.92, 'day': datetime.date(2014, 10, 15), 'valuey': 74},{'valuex': 58.55, 'day': datetime.date(2014, 10, 16), 'valuey': 61}]

for i in d1:
    d11 = dict([[str(i['day']),i]])
    print d11

{'2014-10-15': {'day': datetime.date(2014, 10, 15), 'valuey': 74, 'valuex': 65.92}}
{'2014-10-16': {'day': datetime.date(2014, 10, 16), 'valuey': 61, 'valuex': 58.55}}

OR

new_dict = {}
for i in di:
   new_dict[str(i['day'])] = i

更新

试试这个

>>> from django.http import JsonResponse
>>> response = JsonResponse({'foo': 'bar'})
>>> response.content
'{"foo": "bar"}'