2010-04-29 32 views
3

我正在爲預訂應用程序設計一個RESTful API。您可以申請住宿列表。這就是我不知道如何設計JSON代表的地方。這是我的XML表示:RESTful API:如何建模JSON表示?

<?xml version="1.0" encoding="utf-8"?> 
<accommodations> 
    <accommodation> 
     <name>...</name> 
     <category>couch</category> 
    </accommodation> 
    <accommodation> 
     <name>...</name> 
     <category>room</category> 
    </accommodation> 
<accommodations> 

我第一次嘗試將其轉換爲JSON導致此輸出(1):

{ 
    "0": { 
     "name": "...", 
     "category": "couch" 
    }, 
    "1": { 
     "name": "...", 
     "category": "room" 
    } 
} 

但是當我看着別人的API是如何做到的,我發現了一些期待更多類似這樣(2):

[ 
    { 
     "name": "...", 
     "category": "couch" 
    }, 
    { 
     "name": "...", 
     "category": "room" 
    } 
] 

我知道版本1是一個對象,版本2是一個數組。

但是在這種情況下哪個更好?

回答

2

可以按如下步驟進行建模的JSON:

{ 
    "accomodations" : [ 
    { 
     "accomodation" : { 
     "name": "...", 
     "category": "couch", 
     "uri": "http://example.org/accomodations/accomodation_1" 
     } 
    }, 
    { 
     "accomodation": { 
     "name": "...", 
     "category": "room", 
     "uri": "http://example.org/accomodations/accomodation_2" 
     } 
    } 
    ] 
} 

,你可以回到這一個GET http://example.org/accomodations 創建一個新的住宿然後可以通過POST http://example.org/accomodations的東西,如在身體下面做:

{ 
    "accomodation": { 
    "name": "...", 
    "category": "room" 
    } 
} 
+1

謝謝,我已經在其他API中看過幾次了。但是這不是兩回事嗎?我要求「住宿」(順便說一下:真的2米),並獲得一個列表 - 住宿當然。爲什麼重複這個?還是有技術上的原因? – janpio 2010-04-29 18:58:41

+0

如果稍後需要向其添加字段,則返回一個對象而不是數組會使其更容易。 例如說你想通過查詢參數的住宿篩選從某酒店,如: GET /住宿所有者=希爾頓 你可能要包括所有人這樣的地址: { 「的住宿」: /*的住宿在這裏*/ ], 「主人」: 「希爾頓」, 「地址」: 「黨街123」, } 因爲你已經是返回一個對象,現有的客戶不要」噸休息。我正在返回一個數組,現有的客戶端需要進行調整。 – dafmetal 2010-04-29 19:19:08

+0

好的,用這種風格工作的一天清楚地表明,嵌套列表也更容易。例如,當您開始爲住宿設置一個屬性列表時,您必須切換到該方法,爲什麼不在主列表中使用它。 這種方式更統一。 – janpio 2010-04-30 14:25:49

0

如果你打算使用鍵(1,2,...)作爲通信中的標識符回到服務器,那麼字典會更好,否則我會選擇數組。那麼唯一的ID可能是一個條目中的一個字段。

0

棒與號碼2

不要你的X後,您的JSON輸出模型ML版本。

每個主要API都使用陣列表示。大多數解析庫將返回類似List的實例,這使得處理它們包含的所有對象變得非常容易。

數字1是有效的JSON,但這不是絕大多數開發人員所期望的。