Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在从.net后端到js前端的两个大型嵌套JSON之间进行JSON差异/修补?_Javascript_Json_Signalr_Asp.net Core 3.1_Json Patch - Fatal编程技术网

Javascript 如何在从.net后端到js前端的两个大型嵌套JSON之间进行JSON差异/修补?

Javascript 如何在从.net后端到js前端的两个大型嵌套JSON之间进行JSON差异/修补?,javascript,json,signalr,asp.net-core-3.1,json-patch,Javascript,Json,Signalr,Asp.net Core 3.1,Json Patch,我有一个非常大的json,每秒有一个非常小的变化 im使用asp.net core 3.1和signalr core。客户端使用运行纯js和jquery的浏览器 现在对于每一个更改,我都会再次发送所有的json。我知道这不是一个好办法 我想做的只是将更改发送到客户端,然后用javascript将更改修补到主JSON 通过谷歌搜索,我知道这是一个JSON diff/patch或diff/Merge操作,但我没有找到任何关于如何实现这一点的信息 那么,如何在信号机中实现差异/压缩操作 杰姆和杰姆点燃

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

im使用asp.net core 3.1和signalr core。客户端使用运行纯js和jquery的浏览器

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

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


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

那么,如何在信号机中实现差异/压缩操作

杰姆和杰姆点燃了大约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补丁提供一个原子更新请求,该请求使用一系列“添加”、“删除”、“替换”、“移动”和“复制”操作来修补JSON。JSON补丁RFC的作者之一Mark Nottingham(IETF):

这有很多优点。因为它是一种通用格式,所以您可以 编写服务器端和客户端代码一次,并在多个用户之间共享 申请的数量。你可以做一次QA,并确保你做对了。 此外,您的API将变得不那么复杂,因为它的 URI约定,带来了更大的灵活性,并使 新开发人员的方法。使用此方法还将创建缓存 操作更加正确;因为对资源的修改将 “旅行”通过其URL,而不是其他某个URL,正确存储 响应将失效

ASP.NET核心提供JSON补丁支持。可以通过从Package Manager控制台安装Microsoft JSON修补程序库()来添加JSON修补程序:

Install-Package Microsoft.AspNetCore.JsonPatch
然后使用类及其方法应用修补程序,如
ApplyTo
Add
Copy
Move
Remove
Replace

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

然后使用PUT和PATCH方法使用JSON补丁操作更新现有资源

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


在JavaScript/Node.js项目中,您还可以从更大的js实现列表中进行选择,特别是

资源:

  • .NET核心教程:


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

“通过谷歌搜索,我知道这是一个JSON差异/补丁或差异/合并操作”不,这是一个数据差异/合并问题。用于将数据从服务器传输到客户端的序列化格式是不相关的。为了解决您的问题,您能否提供一些关于数据结构和更改量/结构的信息?这只是一个相当简单/简单的模型的巨大列表,其中一些字段偶尔会发生变化吗?或者它是一个高度嵌套的模型,其中可能需要传输任何级别上的更改。实际上,它是一个最大深度为4的大型对象数组。它不是平坦的,更改可能在任何深度上。我不能给你确切的数据,但我会用数据结构的思想来编辑这个问题。最精确但也是最麻烦的方法是对值进行区分,然后将类似于
{id:0,“J_m.SA_H2 0.a”:1,“J_m.SA_H2 0.b”:2,“J_m_Lit.OE 0.o.xxx”:{…}
的内容发送到前端。根据更改的范围,还可以修改整个块,甚至整行;还是比发送整个行列表更好。在前端,通过id获取条目,然后
for(让key In objectWithChanges){const path=key.split(“.”,value=objectWithChanges[key];…}
遍历路径并设置值(无论是原语值还是对象)