是否有标准库或工具用于计算和应用差异到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))
Run Code Online (Sandbox Code Playgroud)
我当然可以自己实现一个,但是有很多边缘情况需要考虑.以下是一些我能想到的简单(虽然有些不尽如人意)的方法,例如:
滚动我自己的JSON修补程序.渐近地,这可能是最好的方法,因为它可以支持JSON文档的所有相关功能,并支持一些专门的方法来执行诸如diffing int,double和string之类的东西(使用相对编码/编辑距离) .然而,JSON有很多特殊情况,我有点怀疑没有经过大量测试就试图这样做,所以我更愿意找到一些已经解决了这个问题的东西让我相信它,并且不必担心由于我的JSON补丁中的错误而出现的网络Heisenbugs
只需使用动态编程直接计算JSON字符串之间的编辑距离.不幸的是,如果客户端和服务器具有不同的JSON实现(即,它们的字段的顺序可以不同地序列化),则这不起作用,并且作为二次时间操作也是相当昂贵的.
使用协议缓冲区.协议缓冲区有一个内置的diff方法,它正是我想要的,它们是一个很好的二进制可序列化的网络友好格式.不幸的是,因为它们也是严格类型的,它们缺少使用JSON的许多优点,例如动态添加和删除字段的能力.现在这是我目前倾向于的方法,但它可能使未来的维护非常可怕,因为我需要不断更新我的每个对象.
做一些非常讨厌的事情,比如为每种类型的对象制作一个自定义协议,并希望我能在两个地方做到正确(是的!).
当然,我真正希望的是这里有一个stackoverflow上的人通过参考一个节省空间的javascript对象不同/修补程序,在生产环境和多个浏览器中经过良好测试,以节省一天.
* …
作为我的发布过程的一部分,我必须比较我的应用程序使用的一些JSON配置数据.作为第一次尝试,我只是漂亮地打印了JSON并对它们进行了差异化(使用kdiff3或者只是diff).
然而,随着数据的增长,kdiff3会混淆输出中的不同部分,使得添加看起来像巨型修改,奇数删除等.这使得很难弄清楚什么是不同的.我也尝试过其他差异工具(meld,kompare,diff,还有其他一些),但它们都有同样的问题.
尽管我付出了最大努力,但我似乎无法以diff工具可以理解的方式格式化JSON.
示例数据:
[
{
"name": "date",
"type": "date",
"nullable": true,
"state": "enabled"
},
{
"name": "owner",
"type": "string",
"nullable": false,
"state": "enabled",
}
...lots more...
]
Run Code Online (Sandbox Code Playgroud)
以上可能不会导致问题(当开始有数百行时会出现问题),但这就是所比较的要点.
这只是一个样本; 完整对象是4-5个属性,有些属性中有4-5个属性.属性名称非常统一,但它们的值非常不同.
通常,似乎所有的diff工具都会将结束"}"与关闭"}"的下一个对象混淆.我似乎无法打破这种习惯.
我尝试添加空格,更改缩进,并在各个对象之前和之后添加一些"BEGIN"和"END"字符串,但该工具仍然感到困惑.
嗯,我的问题有点复杂,但这里是:
我有一个 Python 服务器,用于存储客户端(用 JavaScript 编写)会话,并且完全了解客户端当前在其状态中存储的内容。
服务器将不断从数据库中获取数据并检查客户端状态的任何更改。数据为JSON;主要由列表和字典组成。我需要一种方法来向客户端发送响应,告诉它更改其数据以匹配服务器的数据。
我考虑过:
我对此感到非常困惑,如果有任何帮助,我将不胜感激。
更新
我正在考虑向客户端发送空值以删除不再需要的数据,并且服务器已从其客户端状态版本中删除数据。