是否有標準庫或工具用於計算JSON文檔並將差異應用於JSON文檔?基本上,我有一大堆想要在網絡中保持同步的大文件,而且我希望避免在每次我想同步它們時重新發送它們的整個狀態(因爲其中許多變量不會發生變化)。換句話說,我只想傳輸已更改的字段,而不是重新傳輸整個對象。我想,這將是方便有類似下面的一套方法:針對JSON對象的增量編碼
//Start with two distinct objects on the server
// prev represents a copy of the state of the object on the client
// next represents a copy of the state of the object on the server
//
//1. Compute a patch
patch = computePatch(prev, next);
//2. Send patch over the network
//3. Apply the patch on the client
applyPatch(prev, patch);
//Final invariant:
// prev represents an equivalent object to JSON.parse(JSON.stringify(next))
我肯定能實現一個自己,但也有相當需要考慮一些邊緣情況。這裏有一些我能想到如的簡單(雖然有點不盡人意)方法:
推出自己的JSON的修補。漸近地說,這可能是最好的方法,因爲它可以支持JSON文檔的所有相關功能,並支持一些專門的方法來執行差異整數,雙精度和字符串(使用相對編碼/編輯距離) 。但是,JSON有很多特殊情況,我有點不想做這個測試,所以我更願意找到一些能夠解決這個問題的東西,這樣我就可以信任它,並且不必擔心由於我的JSON修補錯誤導致網絡Heisenbugs出現
只需使用動態編程計算JSON字符串之間的編輯距離即可。不幸的是,如果客戶端和服務器有不同的JSON實現(即它們的字段順序可能不同),那麼這不起作用,而且它也是一個非常昂貴的二次時間操作。
使用協議緩衝區。協議緩衝區有一個內置的diff方法,它完全符合我的要求,並且它們是一個很好的二進制序列化網絡友好格式。不幸的是,因爲它們也是嚴格鍵入的,所以它們缺乏使用JSON的許多優點,例如動態添加和刪除字段的能力。現在,這是我目前所傾向的方法,但它可能會使未來的維護非常可怕,因爲我需要不斷更新每個對象。
做一些真正討厭的,就像爲每個對象類型的自定義協議,並希望我得到它的權利在這兩個地方(是正確的!)。
當然什麼我真的希望的是有人在這裏計算器來通過和天保存到一個空間高效的JavaScript對象不同/補丁參考已經在生產環境,並跨越了很好的測試,多個瀏覽器。
* 更新 *
我開始寫我自己的補丁,它的一個早期版本可在github上的位置:
https://github.com/mikolalysenko/patcher.js
我猜因爲似乎沒有在這裏,我會接受一個JSON修補程序的有趣測試用例列表作爲備選答案。
既然您提到了「需要考慮的不少邊緣案例」,如果您列舉了需要處理的邊緣案例以及它們應該如何處理,可能會有所幫助(對於您的答案和後代)解決。 – Phrogz
另外:您的問題的後半部分很好地表明您已經考慮過這個問題,並且作爲「解決方法」答案的一部分可能不錯,但與問題無關,對吧? – Phrogz
總是添加一個「髒」標誌。 –