2016-12-07 4 views
1

Я запускаю запрос фильтра в Django, и мои результаты возврата выглядят следующим образом.Как преобразовать результаты поиска в Json serializable object в Django

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 этого URL был вызван с использованием 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 
+0

Возможный дубликат [не JSON сериализации] (http://stackoverflow.com/questions/16336271/is -not-json-serializable) – Selcuk

+0

@Selcuk обновил вопрос. – User42

+0

@Selcuk - согласно моему пониманию, запрос возвращает объект типа QuerySet, который не является Json Serializable, но конвертирует search_result, чтобы преобразовать результат в объект типа списка, который является Json Serializable. Пожалуйста, прокомментируйте, если мое понимание здесь неверно. – User42

ответ

1

Это может помочь вам: -

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', возможно, он работает. –

Смежные вопросы