簡體   English   中英

DJango:格式化json序列化

[英]DJango: formatting json serialization

我有以下 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"
     }
  }, 
  ....
 }

]

你可以通過這種方式獲得漂亮的格式:

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

django doc 作為第一條評論說

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")
    ...

如果您總是希望以這種方式對模型進行排序,則可以使用排序元類選項:

class Company(models.Model):

    class Meta:
        ordering = ["sorting_field"]
    ...

最后要說明的是,如果您的目的是使用 Web 服務公開模型,我強烈建議您查看一下ttletypie 從長遠來看,它可能會對您有所幫助,因為它提供了許多其他方便的功能來幫助實現這一目標。

在 Django 1.7 中,我可以通過使用序列化程序的indent參數獲得很好的縮進 JSON。 例如,在從我的數據庫轉儲數據的命令中:

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

indent參數從 1.5 版開始就存在於 Django 中。 我得到的輸出如下所示:

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

要對您的記錄進行排序,那么您必須按照Kevin 的建議進行操作並使用order_by或任何您想要對傳遞給序列化程序的記錄進行排序的方法。 例如,我使用itertools.chain對返回不同模型實例的不同查詢集進行排序。

序列化程序不支持根據您的喜好對字段進行排序或重命名。 您必須編寫自己的代碼來執行此操作或使用外部工具。

JSON 沒有縮進,它只是結構化數據。 瀏覽器或其他工具可能會格式化 JSON,使其看起來不錯,但默認情況下它不存在。 它也不是 JSON 的一部分,因為格式只是它在屏幕上的外觀。 JSON 通常由其他代碼或服務處理,因此它們不關心縮進,只要數據結構正確即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM