Node.js中使用JSONata处理JSON文件返回undefined的原因排查
在Node.js中使用JSONata处理JSON文件时返回undefined,这是为什么?
我尝试了以下代码,但返回结果为“undefined”:
index.js
const jsonata = require("jsonata"); const fs = require("fs"); (async () => { const json = fs.readFileSync("test.json", {encoding:'utf8', flag:'r'}); const expression = jsonata('V1.fields'); const result = await expression.evaluate(json); console.log(result); })()
test.json
[ 12345, { "V1": { "fields": { "id": 0 } } } ]
输出
% node index.js undefined
问题原因及修复方案
1. 未将读取的JSON字符串解析为对象
fs.readFileSync读取的是纯字符串格式的JSON内容,JSONata的evaluate方法直接接收字符串时,会把它当作普通文本处理,而非可遍历的JSON对象,因此无法识别V1.fields路径。
2. JSONata表达式未匹配数组结构
你的test.json是一个数组,第一个元素是数字12345,第二个元素才是包含V1的对象。直接使用V1.fields会在数组本身(而非数组内部元素)上查找属性,自然返回undefined。
修复后的代码
const jsonata = require("jsonata"); const fs = require("fs"); (async () => { // 读取并解析JSON字符串为JavaScript对象 const jsonStr = fs.readFileSync("test.json", {encoding:'utf8', flag:'r'}); const data = JSON.parse(jsonStr); // 方式一:通过索引定位数组第二个元素(数组索引从0开始) const expression = jsonata('$[1].V1.fields'); // 方式二:过滤出包含V1属性的元素(更灵活,适配元素位置不固定的场景) // const expression = jsonata('$[V1].V1.fields'); const result = await expression.evaluate(data); console.log(result); // 输出: { id: 0 } })()
内容的提问来源于stack exchange,提问作者Robert La Ferla
相关产品推荐
相关产品推荐

