相关疑难解决方法(0)

JSON对象的Delta编码

是否有标准库或工具用于计算和应用差异到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)

我当然可以自己实现一个,但是有很多边缘情况需要考虑.以下是一些我能想到的简单(虽然有些不尽如人意)的方法,例如:

  1. 滚动我自己的JSON修补程序.渐近地,这可能是最好的方法,因为它可以支持JSON文档的所有相关功能,并支持一些专门的方法来执行诸如diffing int,double和string之类的东西(使用相对编码/编辑距离) .然而,JSON有很多特殊情况,我有点怀疑没有经过大量测试就试图这样做,所以我更愿意找到一些已经解决了这个问题的东西让我相信它,并且不必担心由于我的JSON补丁中的错误而出现的网络Heisenbugs

  2. 只需使用动态编程直接计算JSON字符串之间的编辑距离.不幸的是,如果客户端和服务器具有不同的JSON实现(即,它们的字段的顺序可以不同地序列化),则这不起作用,并且作为二次时间操作也是相当昂贵的.

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

  4. 做一些非常讨厌的事情,比如为每种类型的对象制作一个自定义协议,并希望我能在两个地方做到正确(是的!).

当然,我真正希望的是这里有一个stackoverflow上的人通过参考一个节省空间的javascript对象不同/修补程序,在生产环境和多个浏览器中经过良好测试,以节省一天.

* …

javascript json node.js

37
推荐指数
3
解决办法
8016
查看次数

以文本方式区分JSON

作为我的发布过程的一部分,我必须比较我的应用程序使用的一些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 diff text json

14
推荐指数
1
解决办法
1万
查看次数

比较 JSON 文档

嗯,我的问题有点复杂,但这里是:

我有一个 Python 服务器,用于存储客户端(用 JavaScript 编写)会话,并且完全了解客户端当前在其状态中存储的内容。

服务器将不断从数据库中获取数据并检查客户端状态的任何更改。数据为JSON;主要由列表和字典组成。我需要一种方法来向客户端发送响应,告诉它更改其数据以匹配服务器的数据。

我考虑过:

  • 发送已更改元素的 JSON 序列化递归差异字典并且不使用列表 - 不错,但我不能使用列表
  • 将客户端状态的整个服务器版本发送给客户端 - 成本高昂且效率低下
  • 找到一些复杂的方法来区分列表 - 痛苦且混乱
  • 转储为 JSON 后两者基于文本的差异 - 简直愚蠢

我对此感到非常困惑,如果有任何帮助,我将不胜感激。

更新

我正在考虑向客户端发送空值以删除不再需要的数据,并且服务器已从其客户端状态版本中删除数据。

python diff json

5
推荐指数
1
解决办法
2159
查看次数

标签 统计

json ×3

diff ×2

python ×2

javascript ×1

node.js ×1

text ×1