Javascript 如何在从.net后端到js前端的两个大型嵌套JSON之间进行JSON差异/修补?
我有一个非常大的json,每秒有一个非常小的变化 im使用asp.net core 3.1和signalr core。客户端使用运行纯js和jquery的浏览器 现在对于每一个更改,我都会再次发送所有的json。我知道这不是一个好办法 我想做的只是将更改发送到客户端,然后用javascript将更改修补到主JSONJavascript 如何在从.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 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];…}
遍历路径并设置值(无论是原语值还是对象)