如何将搜索查询结果转换为Django中的Json可序列化对象
问题描述:
我在Django中运行过滤器查询,返回结果如下。如何将搜索查询结果转换为Django中的Json可序列化对象
search_result = [{'code': '12345', 'city': 'city1', 'country': 'USA', 'state': 'state1'}, {'code': '15675', 'city': 'city2', 'country': 'USA', 'state': 'state2'}]
我将这个返回的数据存储到字典。
data_dict["return_result"] = search_result
data_dict["is_success"] = True
现在我回到这个data_dict为JsonResponse(BCZ该网址的使用AJAX调用)。
JsonResponse(data_dict)
在这个过程中我得到下面的错误 -
[{'code': '12345', 'city': 'city1', 'country': 'USA', 'state': 'state1'}, {'code': '15675', 'city': 'city2', 'country': 'USA', 'state': 'state2'}] is not JSON serializable.
上面提到的数据是因为单引号的不是一个有效的JSON。如果所有单引号替换为双引号,那么这是一个有效的json。
有什么办法可以将其转换为有效的json或搜索查询返回有效的json。
完整堆栈跟踪:
Traceback (most recent call last):
File "/home/rana/DjangoProject/VirtualEnv/e/lib/python3.4/site-packages/django/core/handlers/base.py", line 149, in get_response
response = self.process_exception_by_middleware(e, request)
File "/home/rana/DjangoProject/VirtualEnv/e/lib/python3.4/site-packages/django/core/handlers/base.py", line 147, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/rana/DjangoProject/VirtualEnv/e/lib/python3.4/site-packages/django/contrib/auth/decorators.py", line 23, in _wrapped_view
return view_func(request, *args, **kwargs)
File "/home/rana/DjangoProject/Sanstha/sansthaonline/tenant/views/zip_city_search.py", line 37, in search_zip_city
return JsonResponse(context)
File "/home/rana/DjangoProject/VirtualEnv/e/lib/python3.4/site-packages/django/http/response.py", line 505, in __init__
data = json.dumps(data, cls=encoder, **json_dumps_params)
File "/usr/lib/python3.4/json/__init__.py", line 237, in dumps
**kw).encode(obj)
File "/usr/lib/python3.4/json/encoder.py", line 192, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode
return _iterencode(o, 0)
File "/home/rana/DjangoProject/VirtualEnv/e/lib/python3.4/site-packages/django/core/serializers/json.py", line 115, in default
return super(DjangoJSONEncoder, self).default(o)
File "/usr/lib/python3.4/json/encoder.py", line 173, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: [{'city': 'city1', 'country': 'USA', 'code': '12345', 'state': 'state1'}, {'city': 'city2', 'country': 'USA', 'code': '15675', 'state': 'state2'}] is not JSON serializable
答
这可能会帮助你: -
import json
from django.shortcuts import HttpResponse
from django.core.serializers.json import DjangoJSONEncoder
search_result = [{'code': '12345', 'city': 'city1', 'country': 'USA', 'state': 'state1'}, {'code': '15675', 'city': 'city2', 'country': 'USA', 'state': 'state2'}]
data = {'is_success':True,'msg':'Yor Success message','return_result':list(search_result)}
return HttpResponse(json.dumps(data,cls=DjangoJSONEncoder),content_type="application/json")
+0
将搜索结果转换为列表工作得很好。这是标准的方式来做到这一点,或只是一个黑客? 你能解释为什么你的代码工作,我的代码无法工作 – User42
+0
你的查询结果看起来像你使用'.values()',是吗?尝试使用直接'.filter',可能是有效的。 –
的可能的复制[不是JSON序列化(http://stackoverflow.com/questions/16336271/is -not-json-serializable) – Selcuk
@Selcuk更新了这个问题。 – User42
@Selcuk - 根据我的理解,查询返回不是Json可序列化的QuerySet类型对象,但将search_result转换为列表将结果转换为列表类型对象,即Json Serializable。如果我的理解在这里不正确,请发表评论。 – User42