You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用JSONPath-plus从空对象开始构建目标对象?

问题原因及解决方案

核心原因

你的代码未生效的关键在于:JSONPath-plus的callback仅对已存在的匹配节点执行。初始data是空对象,$.book.author这个路径完全不存在,回调函数根本没被触发,自然不会修改原对象。

JSONPath的本质是查询已有节点,默认不会自动创建不存在的嵌套层级。

实现方法

要从空对象构建嵌套对象,有两种可行思路:

思路1:先创建路径层级,再用JSONPath赋值

先通过辅助函数递归创建需要的嵌套路径,再让JSONPath匹配到已存在的节点执行回调:

const data = {};

// 辅助函数:根据路径创建嵌套对象层级
function createNestedPath(obj, path) {
  const keys = path.replace(/^\$./, '').split('.').filter(Boolean);
  let current = obj;
  for (const key of keys) {
    if (typeof current[key] !== 'object' || current[key] === null) {
      current[key] = {};
    }
    current = current[key];
  }
  return obj;
}

// 先创建book.author的路径结构
createNestedPath(data, '$.book.author');

const updater = (cb) => (value, _, { parent, parentProperty }) => {
    parent[parentProperty] = cb(value);
    return parent;
};

const r = JSONPath({
    path: '$.book.author',
    json: data,
    callback: updater(() => 'Foo Bar'),
});

console.log(data);
// 输出:{ book: { author: 'Foo Bar' } }

思路2:直接手动赋值(更高效)

如果是固定结构的嵌套对象,完全不需要依赖JSONPath,直接赋值更简单:

const data = {};
data.book = { author: 'Foo Bar' };
console.log(data);

若为动态路径场景,思路1的辅助函数可配合动态路径使用,比JSONPath更直接。

内容的提问来源于stack exchange,提问作者ar099968

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 09:02:10