2012-01-20 136 views
3

我有一個返回對象列表的REST服務。每個對象包含objectcodeobjectname應該如何格式化JSON響應?

這是我第一次構建REST服務,所以我不知道如何格式化響應。

它應該是:

{ 
    "objects": { 
     "count": 2, 
     "object": [ 
      { 
       "objectcode": "1", 
       "objectname": "foo" 
      }, 
      { 
       "objectcode": "2", 
       "objectname": "bar" 
      }, 
      ...more objects 
     ] 
    } 
} 

OR

[ 
    { 
     "objectcode": "1", 
     "objectname": "foo" 
    }, 
    { 
     "objectcode": "2", 
     "objectname": "bar" 
    }, 
    ...more objects 
] 

我意識到這可能是有點主觀的,但它會更容易消耗?稍後我還需要支持XML格式的響應。

+0

順便說一句,現在我創建一個應用程序,Web服務返回類似於第二個響應(根中的數組)的響應。問題是我無法用RestKit來管理這種情況。有沒有我不知道的限制?當響應是一個數組時,你如何創建響應描述符?提前致謝。 – Ricardo

回答

3

它們是相同的消耗,因爲庫處理都很好。第一個優勢在於第二個優勢:您將能夠擴展響應以包含除對象之外的其他信息(例如類別),而不會破壞現有代碼。

喜歡的東西

{ 
    "objects": { 
     "count": 2, 
     "object": [ 
      { 
       "objectcode": "1", 
       "objectname": "foo" 
      }, 
      { 
       "objectcode": "2", 
       "objectname": "bar" 
      }, 
      ...more objects 
     ] 
    } 

"categories": { 
    "count": 2, 
    "category" : [ 
    { "name": "some category"} 
    ] 
    } 
} 

此外,JSON不應該以任何方式格式化,所以去掉空格,換行等。此外,計數是不是真的有必要,因爲它會被保存在解析對象本身。

+1

你提出了一些我沒有想到的好點。在不破壞現有代碼的情況下,它的響應可擴展性非常好,而且如果響應必須被解析,則count似乎是多餘的。 – xbonez

+0

這就是Facebook返回所有JSON請求的方式,所以我會認爲這種格式的優點。它爲您提供了很大的靈活性,同時保持響應的一致性。 – blachniet

+0

是的,我有相同的經驗(支持不同的響應多個iPhone應用程序版本)。如果我遵循第二種方法,我會破壞以前的版本。 – Femaref

-1

作爲客戶我更喜歡第二種格式。如果第一種格式僅包含「對象」的數量,則這是冗餘信息。

2

我經常看到第一個。有時處理數據以獲得元數據更容易。例如谷歌API使用第一個:http://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA&sensor=true

+0

谷歌響應有一個字段「狀態」:「好」。不應該通過標題傳達? – xbonez

+0

字段'狀態'表示服務器是否返回數據。這是爲了區分url或參數的'錯誤狀態'和'無數據狀態'。如果它是在標題中傳達的,開發人員可以發揮重要作用。 – JuSchz

+0

提到元數據使用情況的好答案。同時也感謝您提供一個真實世界的例子。至於@xbonez關於「地位」的問題,這是來自JSend的一個(有爭議的)哲學http://labs.omniti.com/labs/jsend – RayLuo

1

這不僅是個人喜好的問題,這也是您需求的問題。例如,如果我處於相同的情況,而且確實需要客戶端的對象數,那麼我會採用第一種方法,否則我會選擇第二種方法。

另外請注意,「經典」REST服務器大多會以一種不同的方式工作。如果某個REST函數要返回一個對象列表,那麼它應該只返回這些對象的URL列表。這些URL應該指向詳細的端點 - 所以通過查詢每個端點,您可以獲得有關特定單個對象的詳細信息。