PHP的json_encode函数是否有任何原因无法转义字符串中的所有JSON控制字符?
例如,让我们取一个跨越两行的字符串,并在其中包含控制字符(\ r \n"/ \"):
<?php
$s = <<<END
First row.
Second row w/ "double quotes" and backslash: \.
END;
$s = json_encode($s);
echo $s;
// Will output: "First row.\r\nSecond row w\/ \"double quotes\" and backslash: \\."
?>
Run Code Online (Sandbox Code Playgroud)
请注意,回车符和换行符未转义.为什么?
我正在使用jQuery作为我的JS库,它的$ .getJSON()函数将完全正常,100%信任传入数据.否则我像其他人一样使用JSON.org的库json2.js.但是,如果您尝试解析该编码的字符串,则会引发错误:
<script type="text/javascript">
JSON.parse(<?php echo $s ?>); // Will throw SyntaxError
</script>
Run Code Online (Sandbox Code Playgroud)
你无法获得数据!如果删除或转义该字符串中的\ r \n"和\",则JSON.parse()不会抛出错误.
是否有任何现有的,良好的PHP函数用于转义控制字符.使用搜索和替换数组的简单str_replace将不起作用.
我正在使用`JSON.stringify?字符串化一个对象,但引号不转义?我误解了它是否想逃避报价?
这将输出到模板中,而不会转义任何引号:
{"console":{"free":false}}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用XMLHttpRequest对象从表单发送JSON数据.我可以使用以下函数发送数据.FireBug中没有显示错误,请求中的JSON数据显示为FireBug.
但是,我将数据发送到echo.php,简单地返回内容:
<?php
print_r($_POST);
print_r($_GET);
foreach (getallheaders() as $name => $value) {
echo "$name: $value\n";
}
echo file_get_contents('php://input');
?>
Run Code Online (Sandbox Code Playgroud)
POST数组总是为空,但我可以看到返回的JSON字符串file_get_contents.这是怎么发生的?我究竟做错了什么?
echo.php的输出
Array
(
)
Array
(
)
Host: localhost
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: eo,de-de;q=0.8,de;q=0.6,en-us;q=0.4,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Referer: http://localhost/form.html
Content-Length: 88
Cookie: {{..to much data..}}
Pragma: no-cache
Cache-Control: no-cache
{"type":"my_type","comment":"commented"}
Run Code Online (Sandbox Code Playgroud)
发送功能:
function submit(){
var data={};
data.type=document.form.type.value;
data.comment=document.form.comment.value;
//get right XMLHttpRequest object for current …Run Code Online (Sandbox Code Playgroud) 我有一个页面,我试图使用JSON.parse解析json字符串
'[{"Name":"Eggs","Complete":false,"Notes":"Notes here\n"},{"Name":"Sugar","Complete":false,"Notes":null}]'
Run Code Online (Sandbox Code Playgroud)
但是下面的代码会出错 "Uncaught SyntaxError: Unexpected token"
var groceriesJson = JSON.parse(jsonString);
Run Code Online (Sandbox Code Playgroud)
然后我才知道它因为\n在json字符串中.所以我尝试了这个解决方案.但没有运气.还是一样的错误"Uncaught SyntaxError: Unexpected token"
function escapeSpecialChars(jsonString) {
return jsonString.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 groceriesJson = JSON.parse(escapeSpecialChars(jsonString));
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢
---更新----
我不是手动创建这个字符串,我有c#代码从c#对象创建json字符串
var jss = new System.Web.Script.Serialization.JavaScriptSerializer();
var groceries = jss.Serialize(Model);
Run Code Online (Sandbox Code Playgroud)
然后在我的JavaScript代码中
var jsonString = '@Html.Raw(groceries)'
var groceriesJson = JSON.parse(escapeSpecialChars(jsonString));
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来传输任何文件类型的原始文件数据与任何可能的内容(我的意思是文件和文件内容都是用户生成的)两种方式在Backbone前端使用xhr/ajax调用对抗Django后端.
编辑:也许这个问题还不清楚......
如果在IDE(例如Sublime)中打开文件,则可以查看和编辑包含该文件的实际代码.我试图把THAT原始内容为JSON这样我就可以发送到浏览器,它可以被修改,然后发回.
我发布了这个问题,因为我的印象是因为这些文件的内容可以有效地使用任何编码语言,只是对内容进行字符串化并发送它似乎是一个易于破解或利用的脆弱解决方案.内容可以包含任意数量的',",{和}这似乎打破JSON格式字符,并逃避这些字符将离开代码中的文物,将有效地打破他们(不是吗?).
如果这个假设是错误的,那也是一个可以接受的答案(只要你能指出我忽略的是什么).
我正在开发的项目是一个基于浏览器的IDE,它将从服务器接收完整的文件结构.用户可以添加/删除文件,编辑这些文件的内容,然后将其更改保存回服务器.发送/接收都必须通过ajax/xhr调用来处理.
需要Underscore/jQuery的解决方案很好,如果有专门用于管理原始文件数据的东西,我可以引入额外的库.
需要转义以下json
{
"xx": 'a',
"yy": "bb"
}
Run Code Online (Sandbox Code Playgroud)
在javascript中进入以下结构
{\r\n\t\"xx\": 'a',\r\n\t\"yy\": \"bb\"\r\n}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过此链接中的代码建议,如何使用 JavaScript 转义包含换行符的 JSON 字符串?
var request = {
"xx": "aaa",
"yy": "bb"
}
var myJSONString = JSON.stringify(request);
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");
Run Code Online (Sandbox Code Playgroud)
但没有用,请帮忙。
代码必须像下面这样转义
我正在使用json.stringify()函数在我的div输出1中打印我的结果.
$("div#output1").html(JSON.stringify(response))
结果是:
" {\n \"prediction\": \"Positive\",\n \"confidence_score\": {\n \"Positive\": \"56.49\",\n \"Negative\": \"43.51\"\n }\n}\n\r\n"
Run Code Online (Sandbox Code Playgroud)
我怎样才能删除这些\n \ \r?