JSON 结构对比可运行案例
功能开关:解释 flags 首部插入导致的多处差异
数组按下标逐项比较。在 flags 开头插入记录后,后续元素位置移动,会产生多处修改和一个尾部新增;这不等于多条业务记录都发生了真实字段变更。需要按 ID 配对时应先在自己的业务逻辑中处理。
试一试
在完整工具中打开 ↗示例工作台
JSON 结构对比修改下方数据后重新运行
运行结果
[
{
"op": "replace",
"path": "/data/flags/0/flagKey",
"oldValue": "demo-feature-flags-1",
"value": "demo-inserted"
},
{
"op": "replace",
"path": "/data/flags/0/description",
"oldValue": "新版导航演示",
"value": "新增演示记录"
},
{
"op": "replace",
"path": "/data/flags/1/flagKey",
"oldValue": "demo-feature-flags-2",
"value": "demo-feature-flags-1"
},
{
"op": "replace",
"path": "/data/flags/1/description",
"oldValue": "批量导出演示",
"value": "新版导航演示"
},
{
"op": "replace",
"path": "/data/flags/1/rollout",
"oldValue": 100,
"value": 20
},
{
"op": "replace",
"path": "/data/flags/1/enabled",
"oldValue": false,
"value": true
},
{
"op": "replace",
"path": "/data/flags/1/strategy",
"oldValue": "allowlist",
"value": "percentage"
},
{
"op": "replace",
"path": "/data/flags/1/targeting/groups/0",
"oldValue": "staff",
"value": "beta"
},
{
"op": "replace",
"path": "/data/flags/1/targeting/region",
"oldValue": "demo-west",
"value": "demo-east"
},
{
"op": "add",
"path": "/data/flags/2",
"value": {
"flagKey": "demo-feature-flags-2",
"description": "批量导出演示",
"rollout": 100,
"enabled": false,
"strategy": "allowlist",
"targeting": {
"groups": [
"staff"
],
"region": "demo-west"
}
}
}
]原例已核验,可修改输入后重新运行。
⌘ / Ctrl + Enter 运行01
场景与操作说明
功能开关中,启用标记、灰度比例与定向条件各有语义。查看 JSON 不会更改线上开关,也不证明某个用户已命中规则。
rollout 是示例百分比;本例非负校验没有自动补上 100 的上限。
- 核对 功能开关 的字段层级,保留 flagKey 的字符串类型。
- 修改一项输入并运行,观察结果中的值或路径如何变化。
- 载入对照样本,复现下面的变化;恢复原例会替换当前输入。
02
对照样本
对照样本交换 A 与 B。观察新增与删除的方向、修改前后值如何反转;没有差异时交换仍无差异。
查看对照输入
{
"ok": true,
"data": {
"flags": [
{
"flagKey": "demo-inserted",
"description": "新增演示记录",
"rollout": 20,
"enabled": true,
"strategy": "percentage",
"targeting": {
"groups": [
"beta"
],
"region": "demo-east"
}
},
{
"flagKey": "demo-feature-flags-1",
"description": "新版导航演示",
"rollout": 20,
"enabled": true,
"strategy": "percentage",
"targeting": {
"groups": [
"beta"
],
"region": "demo-east"
}
},
{
"flagKey": "demo-feature-flags-2",
"description": "批量导出演示",
"rollout": 100,
"enabled": false,
"strategy": "allowlist",
"targeting": {
"groups": [
"staff"
],
"region": "demo-west"
}
}
],
"summary": {
"total": 2,
"note": null
}
}
}{
"ok": true,
"data": {
"flags": [
{
"flagKey": "demo-feature-flags-1",
"description": "新版导航演示",
"rollout": 20,
"enabled": true,
"strategy": "percentage",
"targeting": {
"groups": [
"beta"
],
"region": "demo-east"
}
},
{
"flagKey": "demo-feature-flags-2",
"description": "批量导出演示",
"rollout": 100,
"enabled": false,
"strategy": "allowlist",
"targeting": {
"groups": [
"staff"
],
"region": "demo-west"
}
}
],
"summary": {
"total": 2,
"note": null
}
}
}对照样本的实际结果
[
{
"op": "replace",
"path": "/data/flags/0/flagKey",
"oldValue": "demo-inserted",
"value": "demo-feature-flags-1"
},
{
"op": "replace",
"path": "/data/flags/0/description",
"oldValue": "新增演示记录",
"value": "新版导航演示"
},
{
"op": "replace",
"path": "/data/flags/1/flagKey",
"oldValue": "demo-feature-flags-1",
"value": "demo-feature-flags-2"
},
{
"op": "replace",
"path": "/data/flags/1/description",
"oldValue": "新版导航演示",
"value": "批量导出演示"
},
{
"op": "replace",
"path": "/data/flags/1/rollout",
"oldValue": 20,
"value": 100
},
{
"op": "replace",
"path": "/data/flags/1/enabled",
"oldValue": true,
"value": false
},
{
"op": "replace",
"path": "/data/flags/1/strategy",
"oldValue": "percentage",
"value": "allowlist"
},
{
"op": "replace",
"path": "/data/flags/1/targeting/groups/0",
"oldValue": "beta",
"value": "staff"
},
{
"op": "replace",
"path": "/data/flags/1/targeting/region",
"oldValue": "demo-east",
"value": "demo-west"
},
{
"op": "remove",
"path": "/data/flags/2",
"oldValue": {
"flagKey": "demo-feature-flags-2",
"description": "批量导出演示",
"rollout": 100,
"enabled": false,
"strategy": "allowlist",
"targeting": {
"groups": [
"staff"
],
"region": "demo-west"
}
}
}
]