2012-07-05 56 views
1

JSON似乎是一種用純文本表示複雜數據結構的好方法。如果我們把這個複雜的數據結構看作類似於OOP對象的類 - 一個類的實例 - 那麼是否有一種常用的類JSON格式來表示類本身(只是數據部分 - 忘記方法)? JSON本身可以用於這個嗎?如果JSON代表'對象',代表'class'的是什麼?

換句話說,如果JSON編碼名稱 - 值對,如果我只想編碼名稱,應該使用什麼?

我想要這個的原因是我正在設計一個協議來使用jQuery(我是一個完全新手)。客戶端將與服務器通信它想要返回的JSON對象的結構,服務器將返回該結構的JSON對象並添加值。

關鍵在於它是完全控制服務器返回的數據字段(名稱 - 值對)的客戶端。這與我迄今在Web上發現的所有客戶端發出請求(通常包含非常有限的一組參數,如果有的話)以及服務器決定哪些字段的決定有點不同返回JSON回覆。 (顯然,客戶端要求的服務器的數據模型必須與服務器的數據模型一致;如果服務器有一組各自具有自己價格的小部件,則客戶端不能要求各自擁有自己價格的數組的數組,小部件)。

這一定是一個常見問題,我不想重新發明輪子。我想採用一種在網絡上已經普遍使用的解決方案。

編輯 我剛剛發現JSON Schema。這是不是我在找什麼。它包含比我需要的更多的方式。

編輯 我在尋找更多的'這是通常如何做'的答案,而不是'你可以試試...'的答案。 (我自己可以發明幾十個可能的答案。)

回答

0

我一直在尋找部分響應

RESTful API Design: can your API give developers just the information they need?解釋了這一切,並提供了LinkedIn,Facebook和Google的示例。 Google和Facebook都有類似的方法。這裏的謊言瑞安的例子會是什麼樣使用谷歌的做法:

url?fields=status,result(color,price) 

由於谷歌和Facebook是這背後,我也不會驚訝地看到這成爲一個事實上的標準。

在我的情況下,我可能會遇到URL的長度限制,所以必須使用POST代替,但這對我來說是一個很好的起點。

1

要僅在JSON中編碼名稱,可以使用鍵/值對,其中鍵是類名或只是名爲'values'的鍵 - 值是由服務器返回的名稱的字符串數組。例如:

{ 'class_name' : [ "name1", "name2", "name3" ] } 

服務器然後可以從所使用的密鑰檢測類名和用於陣列中的名稱返回所提供的值如果該類支持它,或者如果它不忽略。

+0

我明白了。是的,我認爲這將起作用。對於第二層次的層次結構,我似乎需要在數組中插入新對象而不是字符串。我的原始問題仍然存在:這是如何解決這個問題'在那裏'? – 2012-07-06 08:29:19

1

我期待更多的「這是它是如何完成通常的回答

沒有單一的「正確」的方式做你想做的。許多人有他們的實施。它取決於各種因素 - 你想做什麼,你想要做什麼,你想要做多少效率?


對於簡單的結構,我更喜歡和建議由@ dbr9979給出的答案。

對於嵌套結構,可以有嵌套數組。類似:

{ 
    "nestedfield1": { 
     "nestedfield11":["nestedfield111", "nestedfield112"], 
     "nestedfield12":["nestedfield121", "nestedfield122"], 
     "__SIMPLE_FIELDS__": ["simplefield13", "simplefield14"] 
    } 
} 

的一點是,如果鍵是__SIMPLE_FIELDS__,該值是簡單的字段(字符串,數字等),否則該鍵代表該對象中的密鑰的陣列。


對於更復雜的事情,我建議你有預定義的結構,服務器和客戶端都知道。這在您必須提出多個相同的請求時特別有用。爲每個人分配一些唯一的號碼。喜歡的東西:

1 => <the structure above> 
2 => ["simplefield1", "simplefield2" ..] 
3 => etc .. etc 

服務器存儲上述結構和數據庫什麼的相關數字。而現在,就像現在可能很明顯,客戶端發送所需結構的id,服務器以適當的方式響應。

1

我覺得你這是什麼意思:

客戶端是什麼數據字段(name-value對)服務器返回的完全控制。

就像SQL中的SELECT * FROM BagsSELECT color, price FROM Bag之間的差異。我是否正確地解釋你?

您可以用查詢:

{ 
    'resource': 'Bag', 
    'field_names': ['color', 'price'] 
} 

這將返回響應:

{ 
    'status': 'success', 
    'result': [ 
     {'color': 'red', 'price': 50}, 
     {'color': 'blue', 'price': 45}, 
    ] 
} 

最有可能的,雖然,你實際上可能不需要你的要求是一個JSON對象;我已經看到字段名稱取自查詢字符串的實現,如http://foo.com/bag?fields=color,price