为什么要用数组路径解析?
当 JSON 层级很深、字段名可能有特殊字符或动态变化时,直接使用 obj.a.b.c
这种点语法会显得脆弱。用一个路径数组,如 ["a", "b", 0, "c"]
来逐步下钻,就更通用、可迭代处理。
示例代码
// 假设 jsonStr 是后端返回的 JSON 字符串
const jsonStr = '{"a":{"b":[{"c":42}]}}';
const data = JSON.parse(jsonStr);
// 路径数组
const path = ["a", "b", 0, "c"];
function getByPath(obj, pathArr) {
return pathArr.reduce((acc, key) => (acc != null ? acc[key] : undefined), obj);
}
console.log(getByPath(data, path)); // 42
定位位置并修改
function setByPath(obj, pathArr, value) {
return pathArr.reduce((acc, key, idx) => {
if (idx === pathArr.length - 1) {
acc[key] = value;
} else {
// 若不存在则根据下一步 key 类型自动创建对象或数组
if (acc[key] == null) {
acc[key] = typeof pathArr[idx + 1] === 'number' ? [] : {};
}
}
return acc[key];
}, obj);
}
setByPath(data, path, 100);
console.log(data.a.b[0].c); // 100
更复杂的场景
- 路径包含数字字符串,如
"0"
和0
的区分。 - 需要记录每次访问时的索引位置,以便反向映射到原始字符串(例如编辑器高亮)。
- 在 JSONPath、JMESPath 等已有方案无法满足自定义需求时,这种手写路径法很灵活。
如果你还需要将路径映射回原始字符串的字符位置,可以在解析阶段使用自定义解析器或 AST 工具来记录 token 的起止位置。