如何使用JavaScript来转义包含换行符的JSONstring?
我必须形成一个JSONstring,其中一个值具有新的行字符。 这必须被转义,然后使用AJAX调用发布。 任何人都可以build议一种方法来逃避JavaScript的string。 我不使用jQuery。
把你的JSON和.stringify()
它。 然后使用.replace()
方法并用\\n
replace所有的\n
\\n
。
编辑:
据我所知,没有用于转义string中所有特殊字符的知名JS库。 但是,您可以链接.replace()
方法并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.
但是这很糟糕,不是吗? input函数的美妙之处在于,它们允许您将代码分解成块,并保持脚本的主stream畅通,并且不存在8个链接的.replace()
调用。 所以让我们把这个function放到一个名为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
根据用户667073build议,除了重新sorting反斜杠replace,并修复报价replace
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'); };
我不敢说,亚历克斯给出的答案是相当不正确的,
- Alex试图逃跑的一些angular色根本不需要被转义(比如&和');
- \ b完全不是退格字符,而是一个字边界匹配
- 不能处理需要转义的字符。
这个function
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') ; };
似乎是一个更好的近似值。
像你一样,我一直在寻find几个意见,并张贴replace我的JSON中包含的HTML对象内的特殊转义字符。
我的对象是删除JSON对象中的特殊字符,并呈现json对象内的html。
这是我所做的,希望它的使用非常简单。
首先我做了JSON.stringify我的json对象和JSON.parse结果。
例如:
JSON.parse(JSON.stringify(jsonObject));
它解决了我的问题,并使用纯Javascript完成。
单引号的小更新
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);
这是一个老post。 但对使用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
JSON.stringify上还有第二个参数。 所以,更优雅的解决scheme是:
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);
这是一个古老的问题,但解决scheme并不适合我,因为它没有解决所有情况。 我终于find了答案,在这里做了这项工作
我将发布我的两个使用转义和编码uri组件的组合解决scheme:
// 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); }
在我的一个Ajax调用中出现了相同的情况,其中JSON
由于Textarea字段中的换行符而引发错误。 这里给出的解决scheme并不适合我。 所以我用Javascript的.escape
function,它工作正常。 然后从JSON
检索值,我只是使用.unescape
转义。
在使用任何forms的Ajax时,从CGI服务器收到的响应格式的详细文档似乎在Web上是缺乏的。 这里的一些条目指出,返回的文本或json数据中的换行符必须被转义以防止JSON转换中的无限循环(挂起)(可能通过抛出未捕获的exception创build),无论是由jQuery自动完成还是手动使用Javascript系统或库JSONparsing调用。
在程序员发布这个问题的每一种情况下,都提出了不适当的解决scheme(大多数情况下在发送端用\\ nreplace\ n),这个问题就被解决了。 传递意外embedded控制转义序列(如Windowspath名)的string值时会显示它们的不足之处。 一个例子是“C:\ Chris \ Roberts.php”,其中包含控制字符^ c和^ r,这可能导致string{“file”:“C:\ Chris \ Roberts.php”}的JSON转换为永远循环。 产生这种值的一种方法是故意尝试将PHP警告和错误消息从服务器传递给客户端,这是一个合理的想法。
根据定义,Ajax在幕后使用HTTP连接。 这样的连接使用GET和POST来传递数据,这两者都需要编码发送的数据以避免不正确的语法,包括控制字符。
这给了足够的提示来构build似乎是一个解决scheme(它需要更多的testing):在PHP(发送)端使用rawurlencode对数据进行编码,并在Javascript(接收)端使用unescape对数据进行解码。 在某些情况下,您会将这些应用于整个文本string,而在其他情况下,您只会将它们应用于JSON中的值。
如果这个想法是正确的,可以构造简单的例子来帮助程序员在所有层面上彻底解决这个问题。
使用json_encode()如果您的服务器端脚本语言是PHP,json_encode()转义换行符和其他意想不到的令牌为您(如果没有PHP寻找类似的function为您的脚本局域网)
然后在你的javascript中使用$ .parseJSON(),完成!
我使用内置的jQuery.serialize()来从textarea中提取值以对input进行urlencode。 亲的一部分是,你不必searchreplace你自己的每一个特殊的字符,我也保留换行符和转义html。 为了序列化工作似乎input字段需要有一个名称属性虽然它也添加了相同的属性到逃逸的string需要被取代。 可能不是你在找什么,但对我有用。
var myinputfield = jQuery("#myinputfield"); var text = myinputfield.serialize(); text = text.replace(myinputfield.attr('name') + '=','');