【问题标题】:DJango: formatting json serializationDJango:格式化 json 序列化
【发布时间】:2013-12-05 06:29:50
【问题描述】:

我有以下 DJango 视图

def company(request):
    company_list = Company.objects.all()
    output = serializers.serialize('json', company_list, fields=('name','phonenumber','email','companylogo'))
    return HttpResponse(output, content_type="application/json")

结果如下:

[{"pk": 1, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "741.999.5554", "name": "Remax", "email": "home@remax.co.il"}}, {"pk": 4, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "641-7778889", "name": "remixa", "email": "a@aa.com"}}, {"pk": 2, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "658-2233444", "name": "remix", "email": "b@bbb.com"}}, {"pk": 7, "model": "test.company", "fields": {"companylogo": null, "phonenumber": "996-7778880", "name": "remix", "email": "a@aba.com"}}]

我的问题: 1.我可以控制字段的顺序吗 2.我可以更改字段的名称吗 3. 我期待在浏览器中看到带有缩进的结果,即看到这样的东西而不是一长行:

[
  {
     "pk": 1, 
     "model": "test.company", 
     "fields": 
     {
         "companylogo": null, 
         "phonenumber": "741.999.5554", 
         "name": "Remax", 
         "email": "home@remax.co.il"
     }
  }, 
  {
     "pk": 4, 
     "model": "test.company", 
     "fields": 
     {
        "companylogo": null,  
        "phonenumber": "641-7778889", 
        "name": "remixa", 
        "email": "a@aa.com"
     }
  }, 
  ....
 }

]

【问题讨论】:

    标签: python django json


    【解决方案1】:

    您可以通过这种方式获得漂亮的格式:

    return JsonResponse(your_json_dict, json_dumps_params={'indent': 2})
    

    django doc as the first comment say

    【讨论】:

    • 由于 JsonResponse 是 Django 更高版本(我认为是 1.7)的方式,我会说这个答案是可以使用的。
    • 这是 2014 年(以及今天 2018 年)的发展方向
    【解决方案2】:

    Python(与 Django 无关,从 2.6 开始)有一个内置的 json 库,可以完成您需要的缩进。如果您正在为调试目的寻找快速而肮脏的东西,您可以执行以下操作:

    from django.http import HttpResponse
    from django.core import serializers
    import json
    
    
    def company(request, pretty=False):
        company_list = Company.objects.all()
        output = serializers.serialize('json', company_list, fields=('name','phonenumber','email','companylogo'))
        if pretty:
            output = json.dumps(json.loads(output), indent=4))
        return HttpResponse(output, content_type="application/json")
    

    但是,如果 Company 模型很大,这是一个性能问题。我建议采纳 Dan R 的建议并使用浏览器插件来解析和呈现 json 或提出其他一些客户端解决方案。我有一个脚本,它接收一个 json 文件并执行与上面代码完全相同的操作,读取 json 并使用indent=4 打印出来。

    至于对输出进行排序,您可以在查询集上使用order_by 方法:

    def company(request):
        company_list = Company.objects.order_by("sorting_field")
        ...
    

    如果您总是希望该模型以这种方式排序,您可以使用ordering 元类选项:

    class Company(models.Model):
    
        class Meta:
            ordering = ["sorting_field"]
        ...
    

    最后一点,如果您的目的是通过 Web 服务公开您的模型,我强烈建议您查看 tastypie。从长远来看,它可能会对您有所帮助,因为它提供了许多其他方便的功能来帮助您实现这一目标。

    【讨论】:

      【解决方案3】:

      在 Django 1.7 中,我可以通过使用序列化程序的 indent 参数获得很好的缩进 JSON。例如,在从我的数据库中转储数据的命令中:

      self.stdout.write(serializers.serialize("json",
                                              records,
                                              indent=2))
      

      indent 参数自 Django 1.5 版起就已存在。我得到的输出如下所示:

      [
      { 
        "fields": {
          "type": "something",
          "word": "something else",
        },
        "model": "whatever",
        "pk": 887060
      },
      { 
        "fields": {
          "type": "something more",
          "word": "and another thing",
        },
        "model": "whatever",
        "pk": 887061
      },
      ...
      

      要订购您的记录,您必须执行Kevin suggested 并使用order_by,或者您想要订购您传递给序列化程序的记录的任何方法。例如,我使用itertools.chain 来订购返回不同模型实例的不同查询集。

      序列化程序不支持根据您的喜好对字段进行排序或重命名。您必须编写自己的代码来执行此操作或使用外部工具。

      【讨论】:

      【解决方案4】:

      JSON 没有缩进,它只是结构化数据。浏览器或其他工具可能会格式化 JSON,使其看起来不错,但默认情况下它不存在。它也不是 JSON 的一部分,因为格式只是它在屏幕上的外观。 JSON 通常由其他代码或服务处理,因此它们不关心缩进,只要数据结构正确。

      【讨论】:

      • 我的也是一个服务,看起来漂亮似乎并不重要,但它是用于调试目的
      • 如果您只是希望它在浏览器中查看时看起来不错,请在浏览器扩展/插件站点中搜索 JSON 查看器插件。
      猜你喜欢
      • 2018-10-27
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-02
      • 1970-01-01
      • 2012-01-23
      相关资源
      最近更新 更多