如何使用 JavaScript 转义包含换行符的 JSON 字符串?

IT技术 javascript escaping
2021-01-28 23:50:02

我必须形成一个 JSON 字符串,其中一个值具有换行符。这必须被转义,然后使用 AJAX 调用发布。任何人都可以建议一种使用 JavaScript 转义字符串的方法。我没有使用 jQuery。

6个回答

拿你的 JSON 和.stringify()它。然后使用.replace()方法和替换所有出现的\n\\n

编辑:

据我所知,没有众所周知的 JS 库可以转义字符串中的所有特殊字符。但是,您可以链接该.replace()方法并替换所有特殊字符,如下所示:

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
                                      .replace(/\\'/g, "\\'")
                                      .replace(/\\"/g, '\\"')
                                      .replace(/\\&/g, "\\&")
                                      .replace(/\\r/g, "\\r")
                                      .replace(/\\t/g, "\\t")
                                      .replace(/\\b/g, "\\b")
                                      .replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server. 

但这很讨厌,不是吗?进入函数的美妙之处,因为它们允许您将代码分解成碎片并保持脚本的主要流程干净,并且没有 8 个链式.replace()调用。因此,让我们将该功能放入一个名为, 的函数中escapeSpecialChars()让我们继续前进,并将其连接到prototype chain该的String对象,所以我们可以调用escapeSpecialChars()直接对String对象。

像这样:

String.prototype.escapeSpecialChars = function() {
    return this.replace(/\\n/g, "\\n")
               .replace(/\\'/g, "\\'")
               .replace(/\\"/g, '\\"')
               .replace(/\\&/g, "\\&")
               .replace(/\\r/g, "\\r")
               .replace(/\\t/g, "\\t")
               .replace(/\\b/g, "\\b")
               .replace(/\\f/g, "\\f");
};

一旦我们定义了这个函数,我们的代码主体就这么简单:

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
为了也转义反斜杠,添加.replace(/\\/g, "\\\\"). 我们不得不这样做,而且没有 js 提供的功能,这有点令人遗憾。
2021-03-17 23:50:02
我不得不投反对票,因为正则表达式似乎是错误的。我尝试使用它,但必须通过删除其中一个斜杠来修复正则表达式,例如:/\\n/g 应该是 /\n/g。有关详细信息,请参阅此链接中的“不可打印字符” - RegExp 信息
2021-03-19 23:50:02
如 user667073 的回答所述,此解决方案存在一些错误。请参阅 json.org - & 和 '不得转义。
2021-03-24 23:50:02
谢谢亚历克斯。我必须为所有转义字符执行此操作,对吗?是否有任何 JS 库可以做到这一点?
2021-04-05 23:50:02
这是解决我的问题的确切函数 String.prototype.escapeSpecialChars = function() { return this.replace(/\\/g, "\\\\")。替换(/\n/g,“\\n”)。替换(/\r/g,“\\r”)。替换(/\t/g,“\\t”)。替换(/\f/g,“\\f”)。替换(/"/g,"\\\"")。替换(/'/g,"\\\'")。替换(/\&/g, "\\&"); }
2021-04-05 23:50:02

根据 user667073 建议,除了首先重新排序反斜杠替换,并修复引用替换

escape = function (str) {
  return str
    .replace(/[\\]/g, '\\\\')
    .replace(/[\"]/g, '\\\"')
    .replace(/[\/]/g, '\\/')
    .replace(/[\b]/g, '\\b')
    .replace(/[\f]/g, '\\f')
    .replace(/[\n]/g, '\\n')
    .replace(/[\r]/g, '\\r')
    .replace(/[\t]/g, '\\t');
};
你不必做所有这些。只有反斜杠、换行符、换行符和两个引号。它缺少:单引号Line separator \u2028Paragraph separator \u2029. 参考:es5.github.io/#x7.3
2021-03-12 23:50:02
很好,但为什么方括号是必要的而不是:escape = function (str) { return str .replace(/\\/g, '\\\\') .replace(/\"/g, '\\\ "') .replace(/\//g, '\\/') .replace(/\b/g, '\\b') .replace(/\f/g, '\\f') .replace (/\n/g, '\\n') .replace(/\r/g, '\\r') .replace(/\t/g, '\\t'); };
2021-03-23 23:50:02
完美的。接受的答案(在此之上)根本不起作用。使用 nodeJS。
2021-04-05 23:50:02
我收到此错误: Uncaught SyntaxError: Unexpected token \ in JSON at position 2
2021-04-06 23:50:02

像您一样,我一直在查看一些评论并发布以替换我的 JSON 中包含 html 对象的特殊转义字符。

我的目标是删除 JSON 对象中的特殊字符,并渲染 json 对象内的 html。

这是我所做的,希望它使用起来非常简单。

首先我做了 JSON.stringify 我的 json 对象和 JSON.parse 结果。

例如:

JSON.parse(JSON.stringify(jsonObject));

它解决了我的问题并使用 Pure Javascript 完成。

尝试JSON.parse(JSON.stringify($("body")))在一个带有正文和一些表格的 html 文件中。$("body") 是一个 javascript 对象,但 stringify 将无法解析它。
2021-03-18 23:50:02
我会检查您的查询并回复。
2021-03-19 23:50:02
这肯定会在有stackoverflow错误的复杂和大型对象上中断
2021-03-23 23:50:02
这绝对是要走的路
2021-03-24 23:50:02
这绝对是要走的路!
2021-03-26 23:50:02

我不敢说亚历克斯给出的答案是相当不正确的,委婉地说:

  • Alex 尝试转义的某些字符根本不需要转义(例如 & 和 ');
  • \b 根本不是退格字符而是单词边界匹配
  • 不处理需要转义的字符。

这个功能

escape = function (str) {
    // TODO: escape %x75 4HEXDIG ?? chars
    return str
      .replace(/[\"]/g, '\\"')
      .replace(/[\\]/g, '\\\\')
      .replace(/[\/]/g, '\\/')
      .replace(/[\b]/g, '\\b')
      .replace(/[\f]/g, '\\f')
      .replace(/[\n]/g, '\\n')
      .replace(/[\r]/g, '\\r')
      .replace(/[\t]/g, '\\t')
    ; };

似乎是一个更好的近似值。

实际上,您应该更改顺序以替换双引号之前的反斜杠,否则您将以 \\\\" 结尾。另外,引号行应该是 .replace(/[\"]/g, '\\\\ "')
2021-04-07 23:50:02

单引号的小更新

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val      
        .replace(/[\\]/g, '\\\\')
        .replace(/[\/]/g, '\\/')
        .replace(/[\b]/g, '\\b')
        .replace(/[\f]/g, '\\f')
        .replace(/[\n]/g, '\\n')
        .replace(/[\r]/g, '\\r')
        .replace(/[\t]/g, '\\t')
        .replace(/[\"]/g, '\\"')
        .replace(/\\'/g, "\\'"); 
}

var myJSONString = JSON.stringify(myJSON,escape);