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

时间:2010-11-23 06:32:00

标签: javascript escaping

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

17 个答案:

答案 0 :(得分:127)

拿走你的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,这样我们就可以直接在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

答案 1 :(得分:62)

根据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');
};

答案 2 :(得分:24)

和你一样,我一直在查看几条评论并发帖替换我的JSON中包含html对象的特殊转义字符。

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

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

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

例如:

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

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

答案 3 :(得分:21)

我不敢说亚历克斯给出的答案是不正确的,温和地说:

  • 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')
    ; };

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

答案 4 :(得分: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);

答案 5 :(得分:6)

这是一个老帖子。但对于使用angular.fromJson和JSON.stringify的人来说,它可能仍然有用。 不推荐使用escape()。 改为使用它,

var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.

ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp

答案 6 :(得分:5)

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);

答案 7 :(得分:4)

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

我将使用escape和encode 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);
}

答案 8 :(得分:2)

我在我的一个Ajax调用中遇到了相同的情况,其中JSON由于Textarea字段中的换行符而导致错误。这里给出的解决方案对我没用。 所以我使用了Javascript的.escape函数,它运行正常。然后,要从JSON检索值,我只是使用.unescape进行了转义。

答案 9 :(得分:1)

如果您的Google不断将您降落在这里,并且您的api抛出错误,除非转义了JSON双引号("{\"foo\": true}"),您需要做的是两次字符串化,例如JSON.stringify(JSON.stringify(bar))

答案 10 :(得分:1)

我使用内置的jQuery.serialize()从textarea中提取值到urlencode输入。专业的一部分是你不必自己搜索替换每个特殊字符,我也保留换行符并转义html。为了序列化工作,似乎输入字段需要具有name属性,并且它还将相同的属性添加到需要替换的转义字符串。可能不是你想要的,但它对我有用。

var myinputfield = jQuery("#myinputfield"); 
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');

答案 11 :(得分:1)

如果您的服务器端脚本lang是php,请使用 json_encode(), json_encode()转义换行符&其他意想不到的令牌 (如果不是php寻找你的脚本局域网的类似功能)

然后在你的javascript中使用$ .parseJSON(),完成!

答案 12 :(得分:1)

当使用任何形式的Ajax时,Web上似乎缺少从CGI服务器收到的响应格式的详细文档。这里的一些条目指出必须转义返回文本或json数据中的换行符以防止JSON转换中的无限循环(挂起)(可能通过抛出未捕获的异常创建),无论是由jQuery自动完成还是使用Javascript系统或库JSON解析手动完成调用

在程序员发布此问题的每种情况下,都会提供不充分的解决方案(最常见的是在发送方用\ n中取代\ n)并且问题被删除。当传递意外嵌入控制转义序列的字符串值(如Windows路径名)时,会显示它们的不足之处。一个例子是“C:\ Chris \ Roberts.php”,它包含控制字符^ c和^ r,它们可以导致字符串{“file”:“C:\ Chris \ Roberts.php”}的JSON转换为永远循环。生成此类值的一种方法是故意尝试将PHP警告和错误消息从服务器传递到客户端,这是一个合理的想法。

根据定义,Ajax在后台使用HTTP连接。此类连接使用GET和POST传递数据,这两者都需要对发送的数据进行编码,以避免语法错误,包括控制字符。

这提供了足够的暗示来构建似乎是一个解决方案(它需要更多测试):在PHP(发送)端使用rawurlencode对数据进行编码,并在Javascript(接收)端使用unescape进行解码数据。在某些情况下,您将这些应用于整个文本字符串,在其他情况下,您只将它们应用于JSON内的值。

如果这个想法证明是正确的,可以构建简单的例子来帮助各级程序员一劳永逸地解决这个问题。

答案 13 :(得分:0)

看起来这真是一个古老的帖子:-)但是伙计们,我有这个最好的解决方法,100%它没有复杂的代码工作,是使用编码/解码到base64的两个功能。这些是atob()和btoa()。到目前为止,这是最容易和最好的方式,如果你错过任何要逃脱的角色,也不必担心。

乔治

答案 14 :(得分:0)

最好使用JSON.parse(yourUnescapedJson);

答案 15 :(得分:0)

使用encodeURIComponent()对字符串进行编码。

例如。 var myEscapedJSONString = encodeURIComponent(JSON.stringify(myJSON));

您不需要解码它,因为Web服务器会自动执行同样的操作。

答案 16 :(得分:-1)

永远不要使用正则表达式(我的意思是根本不会使用)。最佳和有效的方法:

String.prototype.escapeJSON = function() {
    var result = "";
    for (var i = 0; i < this.length; i++)
    {
        var ch = this[i];
        switch (ch)
        {
            case "\\": ch = "\\\\"; break;
            case "\'": ch = "\\'"; break;
            case "\"": ch = '\\"'; break;
            case "\&": ch = "\\&"; break;
            case "\t": ch = "\\t"; break;
            case "\n": ch = "\\n"; break;
            case "\r": ch = "\\r"; break;
            case "\b": ch = "\\b"; break;
            case "\f": ch = "\\f"; break;
            case "\v": ch = "\\v"; break;
            default: break;
        }

        result += ch;
    }

    return result;
};