javascript - JSON 对象的增量编码

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












我们不允许提出有关书籍、工具、软件库等建议的问题。您可以编辑问题,以便可以用事实和引用来回答它。


1年前关闭。







Improve this question




是否有标准库或工具用于计算和应用 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 文档的所有相关特性,同时支持一些专门的方法来做一些事情,比如区分整数、 double 和字符串(使用相对编码/编辑距离) .但是,JSON 有很多特殊情况,我对在没有大量测试的情况下尝试这样做有点怀疑,所以我更愿意找到已经为我解决这个问题的东西,以便我可以信任它,并且不必担心由于我的 JSON 修补中的错误而出现网络 Heisenbugs
  • 只需使用动态编程直接计算 JSON 字符串之间的编辑距离。不幸的是,如果客户端和服务器具有不同的 JSON 实现(即它们的字段的顺序可以不同地序列化),这将不起作用,并且作为二次时间操作也非常昂贵。
  • 使用 Protocol Buffer 。 Protocol Buffer 有一个内置的 diff 方法,它完全符合我的要求,它们是一种很好的二进制可序列化网络友好格式。不幸的是,由于它们也是严格类型的,它们缺乏使用 JSON 的许多优点,例如动态添加和删除字段的能力。现在这是我目前倾向于使用的方法,但它可能会使 future 的维护变得非常糟糕,因为我需要不断更新我的每个对象。
  • 做一些非常讨厌的事情,比如为每种类型的对象制作一个自定义协议(protocol),并希望我在这两个地方都做得对(是的,对!)。

  • 当然,我真正希望的是 stackoverflow 上的某个人能够通过引用一个在生产环境和多个浏览器中经过良好测试的节省空间的 javascript 对象differ/patcher 来度过难关。

    * 更新*

    我开始编写自己的补丁程序,它的早期版本可以在 github 上找到:

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

    我想由于这里似乎没有太多内容,因此我将接受 JSON 修补程序的有趣测试用例列表作为替代答案。

    最佳答案

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

    https://github.com/benjamine/JsonDiffPatch

    它使用 Neil Fraser 的 diff_match_patch 库自动处理长字符串。
    它适用于浏览器和服务器(在两个 env 上运行的单元测试)。
    (完整的功能列表在项目页面上)

    您可能需要的唯一未实现的是为特定对象注入(inject)自定义差异/补丁功能的选项,但这听起来并不难添加,欢迎您 fork 它,甚至更好地发送拉取请求.

    问候,

    https://stackoverflow.com/questions/7326532/

    相关文章:

    java - gson 在自定义反序列化器中调用标准反序列化

    javascript - D3 - 如何处理 JSON 数据结构?

    java - 在java中查询一个JSONObject

    javascript - 在 Node.js 下存储 JSON 的简单方法

    java - 仅使用字符串和值解析 JSON 对象

    json - 使用 HTTPie 发送嵌套的 JSON 对象

    java - 如何使用 Jackson json 注释枚举字段以进行反序列化

    c# - 在 asp.net 中将 JSON 转换为 .Net 对象时出错

    json - 如何使用 Elasticsearch 搜索嵌套对象

    c# - Web API 复杂参数属性全部为空