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
相关产品推荐
相关产品推荐

