【发布时间】:2020-11-24 10:29:24
【问题描述】:
我有一个非常大的 json,每秒有一个非常小的变化。
我使用 asp.net 核心 3.1 和信号器核心。并且客户端使用的是运行纯 js 和 jquery 的浏览器。
现在对于每次更改,我都会再次发送所有 json。我知道这不是一个好方法。
我想要做的只是将更改发送到客户端,然后将更改修补到 javascript 中的主 JSON。
通过谷歌搜索,我了解到它是一个 JSON diff/patch 或 diff/Merge 操作,但我没有找到任何关于如何实现它的信息。
那么,我怎样才能在信号器中实现 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 diff/patch 或 diff/Merge 操作" 不,这是一个 data diff/merge 问题。用于将数据从服务器传输到客户端的序列化格式无关紧要。为了解决您的问题,您能否提供一些有关数据结构和更改的数量/结构的信息?就像这只是一个相当简单/平面模型的巨大列表,其中偶尔会发生一些变化?或者它是一个高度嵌套的模型,其中可能存在需要传输的任何级别的更改。
-
实际上它是一个最大深度为 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(let key in objectWithChanges){ const path = key.split("."), value = objectWithChanges[key]; ... }遍历路径并设置值(无论是原始值还是对象)应该是微不足道的
标签: javascript json signalr asp.net-core-3.1 json-patch