如何在Node.js/TypeScript中从JSONPath查询串与值构建JSON对象
在Node.js/TypeScript中通过JSONPath生成JSON对象
我们需要将给定的JSONPath键值对转换为完整的JSON对象,以下是具体实现思路和代码:
输入与期望输出
给定输入
$.student.firstName = "Abc" $.student.subject['physics'].mark=100
期望生成的JSON对象
{ "student":{ "firstName": "Abc", "physics":{ "mark":100 } } }
实现步骤(对应Java思路的Node.js/TypeScript版本)
1. 解析JSONPath,拆分路径节点
先处理JSONPath字符串,提取出层级节点数组:
- 去掉开头的
$符号 - 将
.作为分隔符拆分路径,同时处理['xxx']格式的节点,提取其中的键名,统一成可拆分的格式
2. 逐步构建嵌套对象
从空的根对象开始,遍历路径节点数组,依次创建每个层级的对象属性,遍历到最后一个节点时,为其赋值对应的值。
3. 输出最终JSON对象
构建完成后直接得到目标对象,如需JSON字符串,可使用JSON.stringify进行转换。
具体代码实现
function buildJsonFromPaths(pathEntries: Array<{ path: string; value: any }>): object { const result: Record<string, any> = {}; pathEntries.forEach(({ path, value }) => { // 清理JSONPath格式 let cleanedPath = path.replace(/^\$\./, ''); // 移除开头的$. // 将['xxx']格式转换为.xxx,统一拆分规则 cleanedPath = cleanedPath.replace(/\['([^']+)'\]/g, '.$1'); const nodes = cleanedPath.split('.'); let current = result; // 遍历路径节点(除最后一个),创建嵌套结构 for (let i = 0; i < nodes.length - 1; i++) { const node = nodes[i]; if (!current[node]) { current[node] = {}; } current = current[node]; } // 为最后一个节点赋值 current[nodes[nodes.length - 1]] = value; }); return result; } // 测试示例 const inputEntries = [ { path: "$.student.firstName", value: "Abc" }, { path: "$.student.subject['physics'].mark", value: 100 } ]; const jsonObject = buildJsonFromPaths(inputEntries); console.log(JSON.stringify(jsonObject, null, 2));
运行上述代码后,即可得到期望的JSON对象。
内容的提问来源于stack exchange,提问作者theimpatientcoder
相关产品推荐
相关产品推荐

