繁体   English   中英

如何在从 .net 后端到 js 前端的 2 个大嵌套 json 之间执行 JSON 差异/补丁?

[英]how to do a JSON diff/patch between 2 big nested json from .net backend to js frontend?

我有一个非常大的 json,每秒都有非常小的变化。

我使用asp.net core 3.1和signalr core。 并且客户正在使用运行纯 js 和 jquery 的浏览器。

现在对于每次更改,我都会再次发送所有 json。 我知道这不是一个好方法。

我想要做的只是将更改发送到客户端,然后在 javascript 中将更改修补到主 JSON。

通过谷歌搜索,我知道它是一个 JSON diff/patch 或 diff/Merge 操作,但我没有找到任何关于如何实现它的信息。

那么,我如何才能在 signalr 中实现 diff/pach 操作?

J_m 和 j_m_lit 可能有 100 个键。

数据结构

[
   {
      "id":0,
      "stdid":3808003,
      "lid":10533,
      .
      .
      (40 root keys)
      .
      .
      "J_ps":null,
      "J_ms":null,
      "J_m":{
         "SA_H2 0":{
            "c":"SA_H2",
            "a":"0",
            "b":0,
            "r":"0",
            "w":0,
            "en":"2nd",
            "o":{
               "2:0":{
                  "c":"2:0",
                  "v":1.3,
                  "pv":0.0,
                  "b":0
               },
               "Tie":{
                  "c":"Tie",
                  "v":3.2,
                  "pv":0.0,
                  "b":0
               }
            }
         },....
       
      },
      "J_m_Lit":{
         "OE 0":{
            "c":"OE",
            "a":"0",
            "b":0,
            "r":"0",
            "w":0,
            "en":"Total ",
            "o":{
               "xxx":{
                  "c":"Odd",
                  "v":1.833,
                  "pv":0.0,
                  "b":0
               },
               "zzz":{
                  "c":"Even",
                  "v":1.833,
                  "pv":0.0,
                  "b":0
               }
            }
         },  ....

      },
    
      "J_fre":{
         "tq":[
            0,
            1
         ],
         "m1":[
            23,
            17
         ]
      },
     
   }
]

是的,我认为你在正确的轨道上。

JSON-Patch (RFC6902)的核心是试图解决您在这里面临的问题:部分更新。 JSON Patch 提供了一个原子更新请求,它使用一系列“添加”、“删除”、“替换”、“移动”和“复制”操作来修补您的 JSON。 引用JSON Patch RFC 的作者之一 Mark Nottingham (IETF):

这有很多优点。 由于它是一种通用格式,您可以编写一次服务器端和客户端代码,并在多个应用程序之间共享它。 您可以进行一次 QA,并确保您做对了。 此外,您的 API 将变得不那么复杂,因为它具有更少的 URI 约定,从而带来更大的灵活性并使新开发人员更容易上手。 使用这种方法也会使缓存操作更正确; 由于对资源的修改将通过其 URL 而不是其他 URL 进行“传输”,因此正确存储的响应将失效。

ASP.NET Core 提供 JSON-Patch 支持。 可以通过从包管理器控制台安装 Microsoft JSON 补丁库 ( Nuget ) 添加 JSON 补丁:

Install-Package Microsoft.AspNetCore.JsonPatch

然后使用JsonPatchDocument类及其方法应用补丁,如ApplyToAddCopyMoveRemoveReplace

在 ASP.NET Core Web API 上下文中,我们还可以使用 Microsoft.AspNetCore.Mvc.NewtonsoftJson NuGet包。

然后使用 PUT 和 PATCH 方法通过 JSON Patch 操作更新现有资源。

这篇 MSDN文章有一些很好的解释和一个示例项目。


在 JavaScript/Node.js 项目中,您还可以从更大的 JS 实现列表中进行选择,尤其是fast-json-patch

资源:


旁注:另一个选项是JSON Merge Patch (RFC7396) ,它也可用于发送部分更新,但更像是一个实际的差异/补丁,它只包含更改而不是使用变异操作。 在这方面,JSON Merge Patch 比 JSON Patch 更简单但更受限制,例如您不能将键设置为null (因为 null 表示删除),合并仅适用于对象{..} ,数组[..]只能被替换作为一个整体,合并永远不会失败,可能会导致副作用,因此不是事务性的。 这使得合并补丁(过度)对于某些实际应用程序来说过于简单和不切实际。 还有更多相关的项目,如 JSON-Diffpatch 等,它们采用了类似的方法。 可以说,JSON-Patch 更灵活,但两者都有优点和缺点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM