为什么在保存的文件中添加反斜杠?

时间:2020-09-16 18:12:12

标签: javascript json discord discord.js fs

我有一些代码应该已经将一个单词和其他单词保存在.json文件中,并且KINDA可以完成此工作,它将文件(fs.readFileSync)读取为const并使用fs.WriteFileSync保存时在enter image description here

这样的文本中添加随机数

我不知道为什么会这样做,但确实很烦人(readBl是读取它并将其保存为变量的函数,所以当我想得到它时可以使用命令读取它,我知道我可以用其他方式做到这一点,但IDC)我的代码:

if(msg.content.startsWith('-addconf '))
  {
    var newword = msg.content.slice(9);

    if(blacklisted.includes(newword))
      return msg.channel.sendMessage("This word has already been blacklisted.")

    let rawdata = fs.readFileSync('blacklist.json');
    let rawRead = JSON.parse(rawdata);

    const str = JSON.stringify(rawRead);

    const str1 = str.replace('}', '');
    const str2 = str1.replace('{"blacklist":', '');
    //const str3 = str2.replace('""', '');

    let balance = {
    blacklist: str2 + newword
    };

    let data = JSON.stringify(balance);
    fs.writeFileSync('blacklist.json', data);

    readBl();
    msg.channel.sendMessage("Added a blacklisted word, test it out.")
}

2 个答案:

答案 0 :(得分:2)

JSON值(如键)用双引号引起来。

{ "someKey": "someValue" } 

那么,如何编写一个带有引号的值,例如some"Value"With"Quotes"In"It?而且这里的情况可能会更糟...

(更重要的是,JSON解析器应如何读回这样的值?

some吗?这是语法错误吗?

在JSON中,就像在许多其他需要使用定界符的上下文中一样,我们需要有一种方法来告诉引号"不是结束值的语法元素,而是一部分字符值。

解决方案:转义

所以我们做所谓的“转义”角色。在JSON(和其他语言)中,转义是通过以反斜杠\作为前缀来完成的。

而且...由于反斜杠现在也是一个特殊字符,用于转义另一个字符,您再次遇到相同的问题:如何在值本身中表示实际的反斜杠?

简单,相同的解决方案:您可以反斜杠本身。

因此,在保存JSON字符串值时:

  • 引号"变为\";
  • 反斜杠\变成\\

如何读回去?

任何运行中的JSON阅读器都会正确读取,这是序列化这些字符的正确方法,因此您在这里没有任何问题!

答案 1 :(得分:0)

我想创建一个阻止列表,所以如果您键入“ -addconf”,它将将该单词保存到文件中,并且在bot启动时(或您添加一个新单词),它将黑名单保存为var,以便我稍后进行检查如果邮件的内容中确实包含一些列入黑名单的单词。我该如何实现?

您可以通过将单词存储在数组中来实现。您只需在代码启动时读取一次文件,然后将其添加到数组并将其写入文件即可。

// At the beginning
// blacklist.json needs to contain {"blacklist": []}
let {blacklist} = JSON.parse(fs.readFileSync('blacklist.json'));

// Wherever...
if(msg.content.startsWith('-addconf '))
  {
    var newword = msg.content.slice(9);

    if(blacklist.includes(newword)) {
      return msg.channel.sendMessage("This word has already been blacklisted.")
    }

    blacklist.push(newword);
    fs.writeFileSync('blacklist.json', JSON.stringify({blacklist}));

    msg.channel.sendMessage("Added a blacklisted word, test it out.")
}

您甚至可以直接将数组存储在文件中,无需使用具有blacklist属性的对象(除非您要存储其他数据。


之所以以太多的反斜杠结尾,是因为您的字符串操作可能无法正常工作,因此最终出现乱码。如果您正确地构造数据,则不需要这样做。

相关问题