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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:20:23