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

Sri*_*nt 157 javascript escaping

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

Ale*_*lex 129

拿你的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. 
Run Code Online (Sandbox Code Playgroud)

但这很糟糕,不是吗?输入功能的美妙之处在于它们允许您将代码分成几部分并保持脚本的主流清洁,并且不需要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");
};
Run Code Online (Sandbox Code Playgroud)

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

var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
Run Code Online (Sandbox Code Playgroud)

  • 你不能编辑而不是投票!? (14认同)
  • 如user667073的回答所述,此解决方案中存在一些错误.请参阅json.org - &和'*不得*被转义. (9认同)
  • 因为正则表达式似乎是错误的,所以我不得不对此进行投票.我尝试使用它,但必须通过删除其中一个斜杠来修复正则表达式,例如:/ \\n/g应该是/ \n/g.有关详细信息,请参阅此链接中的"不可打印字符" - [RegExp Info](http://www.regular-expressions.info/characters.html) (5认同)
  • 谢谢亚历克斯 我必须为所有的转义字符做这个吗?是否有任何JS库可以做到这一点? (3认同)
  • 这是解决我的问题的确切函数String.prototype.escapeSpecialChars = function(){return this.replace(/ \\/g,"\\\\").替换(/ \n/g,"\\n").替换(/\r/g,"\\ r").替换(/\t/g,"\\ t").替换(/\f/g,"\\ f").取代(/ "/克," \\\ "").取代(/ '/ G",\\\'").替换(/ \&/ g,"\\&"); } (2认同)
  • 为了也转义反斜杠,添加`.replace(/\\/g, "\\\\")`。我们不得不这样做,而且没有 js 提供的功能,这有点令人遗憾。 (2认同)

Rya*_*yan 62

根据用户667073建议,除了首先重新排序反斜杠替换,并修复报价替换

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');
};
Run Code Online (Sandbox Code Playgroud)

  • 您不必完成所有这些操作.只有反斜杠,换行符,换行符和两个引号.它缺少:单引号,`行分隔符``\ u2028`和`段落分隔符``\ u2029`.参考:http://es5.github.io/#x7.3 (3认同)
  • 很好,但为什么方括号是必要的而不是: 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认同)
  • 完善.接受的答案(在此之上)根本不起作用.使用nodeJS. (2认同)

Bal*_*i M 27

像你一样,我一直在寻找几个评论并发布以替换我的JSON中包含html对象的特殊转义字符.

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

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

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

例如:

JSON.parse(JSON.stringify(jsonObject));
Run Code Online (Sandbox Code Playgroud)

它解决了我的问题,并使用纯Javascript完成.

  • 这绝对是要走的路 (4认同)
  • 这肯定会在复杂和大型对象上出现“stackoverflow”错误 (2认同)

wha*_*ger 22

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

  • 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')
    ; };
Run Code Online (Sandbox Code Playgroud)

似乎是一个更好的近似.

  • 实际上你应该在双引号之前改变顺序来替换反斜杠,否则你最终会得到\\\\".而且引用行应该是.replace(/ [\"]/g,'\\\ "') (5认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 7

这是一个老帖子.但对于使用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.
Run Code Online (Sandbox Code Playgroud)

参考http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp


Mit*_*tzi 6

这是一个老问题,但该解决方案对我来说效果不佳,因为它没有解决所有情况。我终于找到了一个在这里完成工作的答案

我将发布我使用转义和编码 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);
}
Run Code Online (Sandbox Code Playgroud)

  • 也许之后也删除字符串周围的双引号?```escape = (string) -> JSON.stringify(string)[1...-1]``` (2认同)

小智 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);
Run Code Online (Sandbox Code Playgroud)