JSON对象的增量编码

是否有一个标准库或工具用于计算和应用JSON文档的差异? 基本上,我有一大堆想要在networking上保持同步的大文件,而且我希望避免在每次要同步它们时都要重新发送它们的整个状态(因为其中许多variables不会改变)。 换句话说,我只想传输改变的字段,而不是重传整个对象。 我想可能会有如下方法:

//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)) 

我当然可以自己实现一个,但是也有不less边缘案例需要考虑。 以下是我可以想到的一些简单的方法(虽然有些不尽人意),比如:

  1. 滚动我自己的JSON修补程序。 渐近地说,这可能是最好的方法,因为它可以支持JSON文档的所有相关特性,并支持一些特殊的方法来执行差异整数,双精度和string(使用相对编码/编辑距离) 。 然而,JSON有很多特殊的情况,我有点怀疑这么做,而且没有太多的testing,所以我更愿意find一些能够解决这个问题的东西,这样我就可以信任它,不必担心networkingHeisenbugs出现由于我的JSON修补错误

  2. 只需使用dynamic编程直接计算JSONstring之间的编辑距离即可。 不幸的是,如果客户端和服务器具有不同的JSON实现(即它们的字段的顺序可能不同),那么这是行不通的,而且作为二次时间操作也是非常昂贵的。

  3. 使用协议缓冲区。 协议缓冲区有一个内置的diff方法,它正是我想要的,它们是一个很好的二进制序列化的networking友好格式。 不幸的是,因为它们也是严格的types,所以缺less使用JSON的许多优点,例如dynamic添加和删除字段的能力。 现在这是我正在倾向的方法,但它可能会使未来的维护非常可怕,因为我需要不断更新我的每个对象。

  4. 做一些令人讨厌的事情,比如为每种types的对象制定一个自定义的协议,并希望我能在两个地方都做对(对呀!)。

当然,我真正希望的是,这里的人在stackoverflow来通过一个节省空间的JavaScript对象不同/修补程序,已在生产环境和跨多个浏览器已经过良好的testing引用保存一天。

* 更新 *

我开始写我自己的修补程序,它的早期版本可以在这里的github:

https://github.com/mikolalysenko/patcher.js

我想因为在这里似乎没有多less东西,所以我会接受一个JSON修补程序的有趣testing用例列表作为备选答案。

我已经在github上维护一个json diff和patch库(是的,无耻的插件):

https://github.com/benjamine/JsonDiffPatch

它使用Neil Fraser的diff_match_patch lib自动处理长string。 它可以在浏览器和服务器上运行(在env上运行的unit testing)。 (完整function列表在项目页面上)

你可能需要的唯一的东西,没有实现的是为特定的对象注入自定义差异/补丁函数的选项,但是这听起来不难,但是欢迎你去分叉它,甚至更好地发送一个pull请求。

问候,

我遇到了这个问题寻找json-patch的实现。 如果你自己动手,你可能想把它放在这个草稿上。

http://tools.ietf.org/html/draft-pbryan-json-patch-00

在从头开始编写自己的JSON差异和修补程序实用程序之前,我会build议利用现有的差异和修补程序实用程序的纯文本。 所有你需要做的就是编写一些逻辑,它接受一个任意的JSONstring,并以“规范的”JSON格式呈现 – 这样任何两个表示等价数据的JSONstring都具有与文本string相同的“规范”forms – 然后你可以使用普通的“补丁”来计算你所有的增量。

规范JSON的思想似乎并不新鲜,但为任意JSONstring生成规范表示forms所需的代码并不是微不足道的,看起来像谷歌向我展示的所有“叔叔JSON” “现在(包括这个问题的答案,虽然使用Bencode作为规范化格式听起来很有希望)。

这是个好消息,因为这意味着你可以写一些新的有用的东西! 当你find一个可行的解决scheme时,请让我们贴出来(我也想能够生成JSON三angular洲)。

编辑 :在思考这一点之后,我意识到“规范化”的想法并没有真正的帮助,因为即使它们具有相同的“规范forms”,相同的delta / patch通常也不能应用两个文本不同的JSON块。 这引出了一个问题 – 如果你只是简单地通过电报发送一个JSON文档的“deltas”,那么为什么不直接发送它们作为字面明文差异(或者MIME文档types为text / x-diff)呢? 为了防止由于删除补丁而导致的损坏,您可能需要在某处(包括数据文件和差异)添加序列/修订号字段,或者您可以使用Delta-V协议 (为WebDAV开发)来实现雄心勃勃的目标。 也许你已经这样做了? 本周晚些时候我会试着看看你的代码。

使用JSON补丁是标准的方法来做到这一点 。

图书馆存在于许多平台上

在写这篇文章时,支持Javascript,Python,PHP,Ruby,Perl,C,Java,C#,Go,Haskell和Erlang( 完整列表在这里 )。

JSON修补程序是一种用于描述对JSON文档所做更改的格式。 它可以用来避免只有一部分发生变化时发送整个文档。 当与HTTP PATCH方法结合使用时,它允许以符合标准的方式部分更新HTTP API。

补丁文档本身就是JSON文档。

JSON修补程序在IETF的RFC 6902中指定。