2012-12-30 16 views
24

考慮這個JSON響應:是否有乾燥JSON任何衆所周知的方法

[{ 
    Name: 'Saeed', 
    Age: 31 
}, { 
    Name: 'Maysam', 
    Age: 32 
}, { 
    Name: 'Mehdi', 
    Age: 27 
}] 

這工作正常進行數據量小,但是當你想提供更多的數據(比如幾千記錄例如),似乎合乎邏輯的是,以某種方式防止響應JSON中的屬性名稱重複。

我谷歌搜索的概念(DRYing JSON),令我吃驚的是,我沒有找到任何相關的結果。當然,一種方法是使用一個簡單的自制算法來壓縮JSON和使用它之前在客戶端解壓:但是

[['Name', 'Age'], 
['Saeed', 31], 
['Maysam', 32], 
['Mehdi', 27]] 

,最好的做法是不是每個開發人員更好地試圖推倒重來。你們有沒有看到一個廣爲人知的廣爲接受的解決方案?

+0

JSON是一種數據結構,所以它不會真的屬於DRY。 – JJJ

+7

如果使用gzip,這種JSON內在的冗餘壓縮效果非常好。您可能已經知道這一點,但爲防萬一發現沒有這種普遍接受的用於編寫緊湊JSON文檔的技術存在,這可能是原因。 :) –

+2

你的「自制」想法是一個好的開始。搜索「JSON壓縮」,你會發現一些想法,如[HPack](http://stackoverflow.com/questions/11774375/json-compression-for-transfer)。 – DCoder

回答

7

你也許能夠使用CSV格式,而不是JSON,因爲你只有一次指定屬性名稱。但是,這將需要一個像你的例子一樣的剛性結構。

JSON實際上並不是那種適合DRY的東西,因爲考慮到你可以用它做什麼,它已經很好地打包了。就我個人而言,我使用裸數組作爲JSON數據存儲在文件中供以後使用,但對於簡單的AJAX請求,我只是保持原樣。

DRY通常指的是你自己寫的東西,所以如果你的對象是動態生成的,你不應該擔心它。

16

首先,JSON並不意味着代表數據的最緊湊的方式。它的意思是可以直接解析爲一個JavaScript數據結構,可以直接使用而無需進一步解析。如果你想對大小進行優化,那麼你可能不想自我描述JSON,你需要讓你的代碼做一些關於如何處理數據並使用它的假設,並在接收時做一些手動解析結束。這些假設和額外的編碼工作可以節省空間。

如果服務器響應的屬性名稱和格式是已知的代碼,你可以只返回數據爲交替值的數組:

['Saeed', 31, 'Maysam', 32, 'Mehdi', 27] 

或者如果它是安全的假設,名唐「T包含逗號,你甚至可以只返回一個逗號分隔的字符串,你可以拆分成它的棋子,並堅持到你自己的數據結構:

"Saeed, 31, Maysam, 32, Mehdi, 27" 

,或者如果你還希望它是有效的JSON,你可以把像這樣的數組中的字符串,它只是輕微的TLY比我的第一個版本更好,其中的項目本身是數組元素:

["Saeed, 31, Maysam, 32, Mehdi, 27"] 

這些假設和緊湊把更多的責任來解析對您自己的JavaScript的數據,但它是描述的性質是去除自我您開始使用的完整JSON會導致其更緊湊的特性。

+1

值得注意的是,最後一個例子在技術上不是JSON文檔,因爲JSON文檔必須有一個數組或映射作爲根對象。 –

+0

@DietrichEpp - 好點 - 我添加了一個選項,其中字符串也包裝在一個數組中。這些選項之間的選擇取決於OP希望使用合法的JSON保持多少優化傳輸的字節。 – jfriend00

5

使用gzip壓縮,通常很容易內置到大多數web服務器&客戶端?

它仍然會採取一些(額外)時間&內存產生&在每一端解析JSON,但它不會採取太多的時間來通過網絡發送,並會採取以您的名義最小實現的努力。

即使您以某種方式預壓縮源數據,也可能值得一試。

1

JSON實際上並不是一個問題,你經常得到大量的字符串或「屬性」重複(也不適用於XML)。

這正是DEFLATE算法地址的duplicate string elimination組件(由GZip使用)。

雖然大多數瀏覽器客戶端都可以接受GZip壓縮響應,但返回服務器的流量不會。

這是否保證使用「JSON壓縮」(即hpack或其他方案)?

  1. 這是不太可能會比用JavaScript實現用gzip壓縮快得多(這是不可能的;相當快的機器上,你可以在250毫秒壓縮100 KB)。

  2. 安全處理不可信的JSON輸入相當困難。您需要使用基於流的解析並決定最大複雜度閾值,否則您的服務器可能會感到意外。例如,見阿明Ronacher的Start Writing More Classes

    如果您整潔的小Web服務器越來越10000個請求第二通GEVENT但使用json.loads那麼我也許可以讓它爬到停止通過發送16MB以及製作的並嵌套JSON,消耗掉所有的CPU。

相關問題