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

Node.js如何读取JSON文件数据存入常量并解决取值undefined问题

问题根因

  • fs.readFileSync 读取文件返回的是UTF-8格式的字符串,而非JSON对应的JS数组对象,直接遍历字符串时每轮拿到的item是单个字符,自然无法读取latjson等自定义属性。
  • 如果你已经调用JSON.parse解析仍返回undefined,大概率是以下几个常见场景:
    • 路径错误:./json/data.json是相对当前执行node命令的工作目录的路径,而非相对当前JS文件的路径,执行命令的目录不对时会读到空内容或不存在的文件,解析结果不符合预期
    • JSON文件格式异常:比如数组最后一个对象末尾多了逗号、存在非法字符、带有UTF-8 BOM头,都会导致解析失败或结果异常
    • 解析后未做类型校验:可能解析结果为对象而非数组,遍历逻辑自然无法拿到预期字段

修正后代码示例

const fs = require('fs');
const path = require('path');

function calcWeather1() {
    try {
        // 用绝对路径避免工作目录不一致的问题,__dirname为当前JS文件所在目录
        const jsonPath = path.resolve(__dirname, './json/data.json');
        // 读取原始文件内容
        const rawData = fs.readFileSync(jsonPath, 'utf8');
        // 去除首尾空格和可能存在的UTF-8 BOM头
        const cleanData = rawData.trim().replace(/^\uFEFF/, '');
        // 解析JSON
        const data = JSON.parse(cleanData);
        // 校验解析结果是否为数组
        if (!Array.isArray(data)) {
            throw new Error('JSON文件内容不是预期的数组结构');
        }
        // 遍历数组
        for (let item of data) {
            // 可选:增加字段存在性校验,跳过异常项
            if (!item.latjson || !item.lonjson || !item.IdOficina) {
                console.warn('当前项缺少必要字段,已跳过:', item);
                continue;
            }
            const url = `https://api.openweathermap.org/data/2.5/onecall?lat=${item.latjson}&lon=${item.lonjson}&exclude=hourly,daily&appid=123`;
            console.log(`Official Id: ${item.IdOficina}`);
            console.log(url);
            console.log('-----------');
        }
    } catch (err) {
        console.error('处理失败,错误信息:', err.message);
    }
}

快速排查方法

如果运行后仍有问题,可以依次打印rawData(原始读取内容)、cleanData(清洗后内容)、data(解析后内容)三个变量的取值和类型,就能快速定位是读文件环节、JSON解析环节还是遍历逻辑环节出了问题。

内容的提问来源于stack exchange,提问作者Martín JF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:36:01