我必须形成一个JSON字符串,其中一个值具有换行符。必须对此进行转义,然后使用AJAX调用发布。任何人都可以提出一种使用JavaScript对字符串进行转义的方法。我没有使用jQuery。
我必须形成一个JSON字符串,其中一个值具有换行符。必须对此进行转义,然后使用AJAX调用发布。任何人都可以提出一种使用JavaScript对字符串进行转义的方法。我没有使用jQuery。
Answers:
使用您的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
根据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
\u2028
和Paragraph separator
\u2029
。参考:es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
像您一样,我一直在研究一些评论并发表文章,以替换其中包含html对象的JSON中的特殊转义符。
我的对象是删除JSON对象中的特殊字符,并呈现json对象内部的html。
这是我所做的,希望它非常易于使用。
首先,我做了JSON.stringify我的json对象,并JSON.parse结果。
例如:
JSON.parse(JSON.stringify(jsonObject));
它解决了我的问题,并使用Pure Javascript完成。
stackoverflow
出错而
JSON.parse(JSON.stringify($("body")))
使用带有正文和一些表格的html文件。$(“ body”)是一个javascript对象,但stringify解析失败。
坦率地说,我怕说亚历克斯给出的答案是不正确的:
该功能
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')
; };
似乎是一个更好的近似值。
单引号的小更新
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);
这是旧帖子。但对于使用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.
参考http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
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);
这是一个老问题,但是该解决方案对我而言效果不佳,因为它不能解决所有情况。我终于找到了答案是做了工作在这里
我将发布使用转义和编码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);
}
escape = (string) -> JSON.stringify(string)[1...-1]
最好用 JSON.parse(yourUnescapedJson);
如果您的服务器端脚本语言是PHP,请为您使用json_encode(),为您
json_encode()
转义换行符和其他意外标记(如果不使用PHP,则为您的脚本语言查找类似的功能)
然后$.parseJSON()
在您的JavaScript中使用,完成!
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
php JSON.parse双重编码
我在一个Ajax调用中遇到了相同的情况,JSON
由于Textarea字段中的换行符,该错误引发了错误。这里给出的解决方案对我不起作用。所以我使用了Javascript的.escape
功能,效果很好。然后从中检索值JSON
,我只是使用进行了转义.unescape
。
我使用内置的jQuery.serialize()从文本区域中提取值来对输入进行urlencode。优点是您不必自行搜索替换所有特殊字符,而且我还保留换行符并转义html。为了使序列化工作,输入字段似乎需要具有name属性,并且还向转义的字符串添加了相同的属性,需要将其替换掉。可能不是您要找的东西,但它对我有用。
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
当使用任何形式的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(接收)侧使用unscape解码数据。在某些情况下,您会将它们应用于整个文本字符串,在其他情况下,仅将它们应用于JSON中的值。
如果这个想法是正确的,那么可以构造一些简单的示例来帮助各个级别的程序员一劳永逸地解决这个问题。
使用encodeURIComponent()对字符串进行编码。
例如。var myEscapedJSONString = encodeURIComponent(JSON.stringify(myJSON));
您不需要解码它,因为Web服务器会自动执行相同的操作。
永远不要使用正则表达式(我的意思是根本不喜欢)。最佳有效方法:
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;
};