2014-07-18 126 views
11

我很驚訝,之前沒有人問過這個問題。爲什麼和什麼時候我們需要扁平化JSON對象?

通過查看Json對象文檔和快速谷歌搜索沒有得到滿意的結果。

它的優點是什麼?怎麼運行的?


編輯:爲了清楚起見,請看看這個平坦/不平坦的例子。

Fastest way to flatten/un-flatten nested JSON objects

謝謝。

+1

您的意思是縮小?爲了減小文件的大小,節省磁盤空間或帶寬(通常是帶寬)。 – mason

+0

你指的是哪個JSON庫? – evanwong

+0

像這樣:http://stackoverflow.com/questions/19098797/fastest-way-to-flatten-un-flatten-nested-json-objects – Wilbeibi

回答

4

在很多情況下,您可以獲取某些庫自動生成的JSON文本。在整個編程語言中,有很多構建JSON文本的庫(一個是example is here)。

每當庫添加一些額外的對象或數組包裝時,您可能希望擺脫它們,可能是因爲您將JSON發送到服務器,並且您的代碼崩潰,因爲它需要原始值而不是對象(或數組)。或者,如果您的JSON是服務器響應,您不希望生成的Javascript代碼在對象/數組或不對象/數組之間有所不同。在所有這些情況下,扁平化都很有用,因爲它可以節省您的時間。你將不得不實施更少的if/elses,並且你可以可靠地期望你的數據結構儘可能地平坦。

改進上述場景的代碼的另一種方法是以最大可靠方式編寫代碼,因此無法通過多餘的包裝破壞代碼。所以總是期望一些包裝和獲取它的內容。然後,不需要展平。

你看,它取決於什麼是構建JSON和解析它。建築物可能超出你的範圍。

這也導致數據模型問題。如果某個XY的0個條目或某個XY的> 0個條目存在,我已經使用了需要解析的XML代碼。有一個允許有一個XY的0或更多條目的包裝將使生活更輕鬆。這些是數據模型desicions。

在JSON表示我手動組合的對象結構的所有情況下,我期望它不得更改。所以扁平化我所設計的細節將會令人不安。到目前爲止我看到它們不需要展平的標準操作(例如JSON.stringify(),json_encode()等)

5

下面是一個簡單的場景:在Web應用程序中,您有一個正在更新複雜關係對象的HTTP POST。

POST 
update=1 
&user.id=12345 
&[email protected] 
&user.profile.name=Mr. Test 
&user.profile.age=42 
&[email protected] 
&[email protected] 
&[email protected] 
&user.profile.skill.0.id=100 
&user.profile.skill.0.name=javascript 
&user.profile.skill.1.id=200 
&user.profile.skill.1.name=piano 

一切都已經在一個扁平的結構,所以爲什麼不有一個簡單的一對一的綁定?如果您有需要強制執行的約束或安全要求列表,可以通過直接在已排序的密鑰列表上搜索來驗證它們。

扁平結構對於人們來說更容易理解和使用,甚至有一些數據庫去歸一化的交叉。它還允許上下文特定的安全性和約束以可讀但更冗長的方式實現。

當完全顯示用戶的視圖時,您可能希望隱藏用戶技能列表的主鍵ID的顯示。

"user.profile.skill.#.id": { hidden: true, readonly: true } 

但是,當直接注視技能(可能作爲管理員編輯它)時,您可能需要查看ID。

"skill.id": { readonly: true } 

如果你正在寫比以用戶爲中心/自助型CMS應用程序你會得到在船上,並能夠使用簡單的平面模型(下面的嵌套關係模型的抽象平),以促進更多的用戶你只需要嵌套模型。

TLDR:Flat比嵌套更容易閱讀。程序員可以處理嵌套模式,遞歸解析和處理;最終用戶和管理員通常更喜歡將該部分抽象出來。

相關問題