登录

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

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Brett DeWoody 修改于2017-07-23
  • 该问题已被编辑
  • 提问者: Srikant
  • 提问时间: 2010-11-23 14:32

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

浏览 513 关注 0 得票数 190
  • 得票数为Stack Overflow原文数据
原文
已采纳
修改于2014-01-17
  • 该回答已被编辑
  • 回答者: Alex
  • 回答时间: 2010-11-23 14:41
得票数 150

使用您的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() 的函数中。让我们继续将它附加到 String 对象的 prototype chain ,这样我们就可以直接在String对象上调用 escapeSpecialChars()

如下所示:

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
修改于2013-02-27
  • 该回答已被编辑
  • 回答者: Ryan
  • 回答时间: 2012-02-09 09:25
得票数 76

按照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');
};
回答于2012-09-13
得票数 6

在JSON.stringify上还有第二个参数。因此,更优雅的解决方案应该是:

function escape (key, val) {
    if (typeof(val)!="string") return val;
    return val
      .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')
var myJSONString = JSON.stringify(myJSON,escape);
修改于2013-01-03
  • 该回答已被编辑
  • 回答者: Akash Dhawale
  • 回答时间: 2013-01-03 19:17
得票数 10

单引号的小更新

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);
修改于2013-02-12
  • 该回答已被编辑
  • 回答者: Anubhav Trivedi
  • 回答时间: 2013-02-12 22:56
得票数 2

我在一次Ajax调用中遇到了同样的情况,由于Textarea字段中的换行符, JSON 抛出了一个错误。这里给出的解决方案对我不起作用。所以我使用了Javascript的 .escape 函数,它工作得很好。然后,为了从 JSON 中检索值,我只使用 .unescape 对其进行了非转义。

修改于2017-05-23
  • 该回答已被编辑
  • 回答者: Mitzi
  • 回答时间: 2013-06-18 20:31
得票数 6

这是一个古老的问题,但这个解决方案对我来说并不是很有效,因为它并没有解决所有的情况。我终于找到了一个可以完成这项工作的答案 here

我将发布我使用转义和编码uri组件的组合解决方案:

// implement JSON stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
    var t = typeof (obj);
    if (t != "object" || obj === null) {
        // simple data type
        if (t == "string") obj = '"'+obj+'"';
        return String(obj);
    else {
        // recurse array or object
        var n, v, json = [], arr = (obj && obj.constructor == Array);
        for (n in obj) {
            v = obj[n]; t = typeof(v);
            if (t == "string") v = '"'+v+'"';
            else if (t == "object" && v !== null) v = JSON.stringify(v);
            json.push((arr ? "" : '"' + n + '":') + String(v));
        var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
       return rawString;
function escape (key, val) {
    if (typeof(val)!="string") return val;
    var replaced = encodeURIComponent(val);
    return replaced;
JSON.stringifyEscaped = function(obj){
    return JSON.stringify(obj,escape);