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

Discord.js中如何从JSON文件读取指定字段内容?

解决Discord机器人读取JSON特定字段的问题

看起来你现在的问题是读取JSON后直接把整个内容转成字符串发送了,所以没法单独拿到Greetings模块下的questions字段。咱们一步步来修正:

问题根源

你这段代码里:

const _msgs = JSON.stringify(JSON.parse(data), null, 6);
message.channel.send(_msgs );

把解析后的JSON对象又重新转成了格式化的字符串,自然会输出全部内容。咱们需要做的是直接访问解析后对象的特定属性,而不是转成整个字符串。

另外你已经用const FileJson = require("./bot.json");导入了JSON文件,其实require会自动帮你解析JSON成JavaScript对象,完全可以不用再用fs.readFile重复读取,这样代码更简洁。

解决方案

方案1:利用已导入的FileJson变量(推荐)

直接通过对象路径访问Greetings的questions字段,路径是:FileJson.contenido.Greetings[0].questions。这里要注意Greetings是一个数组,第一个元素是存questions的对象,所以用索引[0]。

修改后的message事件代码:

client.on('message', async message => {
  if(message.author.bot) return;
  
  // 获取Greetings模块下的questions字段
  const greetingsQuestions = FileJson.contenido.Greetings[0].questions;
  // 可以直接发送这个数组,或者做内容比对
  message.channel.send(`Greetings的问题列表:${greetingsQuestions.join(', ')}`);
  
  // 如果要做问答匹配,比如判断用户消息是否在questions里
  if(greetingsQuestions.includes(message.content.trim())) {
    // 随机选一个回答
    const greetingsAnswers = FileJson.contenido.Greetings[1].answers;
    const randomAnswer = greetingsAnswers[Math.floor(Math.random() * greetingsAnswers.length)];
    message.channel.send(randomAnswer);
  }
});

方案2:如果坚持用fs.readFile读取

如果因为某些原因需要用fs.readFile,那解析后直接访问属性即可,不要转成整个字符串:

client.on('message', async message => {
  if(message.author.bot) return;
  fs.readFile('bot.json', (err, data) => {
    if (err) { throw err; }
    // 解析成JavaScript对象
    const botData = JSON.parse(data);
    // 访问Greetings的questions
    const greetingsQuestions = botData.contenido.Greetings[0].questions;
    message.channel.send(`Greetings的问题列表:${greetingsQuestions.join(', ')}`);
    
    // 同样可以做匹配逻辑
    if(greetingsQuestions.includes(message.content.trim())) {
      const greetingsAnswers = botData.contenido.Greetings[1].answers;
      const randomAnswer = greetingsAnswers[Math.floor(Math.random() * greetingsAnswers.length)];
      message.channel.send(randomAnswer);
    }
  });
});

补充说明

你的JSON结构里,Greetings是一个包含两个对象的数组:

  • 索引0:存questions数组
  • 索引1:存answers数组
    所以访问的时候要对应正确的索引。如果觉得数组索引不够直观,也可以把JSON结构改成对象形式,比如:
{
  "contenido": {
    "Greetings": {
      "questions": ["Hi", "hello"],
      "answers": ["Hey, how are you?", "What's up?"]
    },
    "goodbyes": {
      "questions":["see you"],
      "answers":["see you"]
    }
  }
}

这样访问起来更清晰:FileJson.contenido.Greetings.questions,不用再记索引了,推荐这种结构哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:11:07