如何在 Django 中将搜索查询结果转换为 Json 可序列化对象

Posted

技术标签:

【中文标题】如何在 Django 中将搜索查询结果转换为 Json 可序列化对象【英文标题】:How to convert search query results into Json serializable object in Django 【发布时间】:2017-04-21 23:11:20 【问题描述】:

我在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

【问题讨论】:

is not JSON serializable的可能重复 @Selcuk 更新了问题。 @Selcuk - 据我了解,查询返回 QuerySet 类型对象,它不是 Json 可序列化的,而是将 search_result 转换为列表,将结果转换为列表类型对象,即 Json 可序列化。如果我的理解在这里不正确,请发表评论。 你是对的。您可以将其转换为列表或使用特殊的DjangoJSONEncoder,如下面的答案所示。 【参考方案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")

【讨论】:

将搜索结果转换为列表效果很好。这是标准的方法还是只是一种技巧?您能否解释一下为什么您的代码有效而我的代码无效 您的查询结果看起来像您使用了 .values() ,是吗?尝试直接使用.filter,可能行得通。

以上是关于如何在 Django 中将搜索查询结果转换为 Json 可序列化对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Oracle 中将结果从 1000 转换为 1000.00? [复制]

Django 查询:返回一个将转换为“AND (...)”的 Q 对象

如何在 Python 中将字典转换为查询字符串?

在 Django 中将 QuerySet 转换为 JSON

如何在 Django 中将日期时间转换为毫秒?

如何在 SQL SERVER 中将内联 SQL 查询转换为 JOINS 以减少加载时间