[英]Why is json_encode adding backslashes?
我使用json_encode
已經很長時間了,到目前為止我沒有遇到任何問題。 現在我正在使用上傳腳本,並嘗試在文件上傳后返回一些 JSON 數據。
我有以下代碼:
print_r($result); // <-- This is an associative array
echo json_encode($result); // <-- this returns valid JSON
這給了我以下結果:
// print_r result
Array
(
[logo_url] => http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg
[img_id] => 54
[feedback] => Array
(
[message] => File uploaded
[success] => 1
)
)
// Echo result
{"logo_url":"http:\/\/mysite.com\/uploads\/gallery\/7f\/3b\/f65ab8165d_logo.jpeg","img_id":"54","feedback":{"message":"File uploaded","success":true}}
誰能告訴我為什么json_encode
添加斜杠?
更新
@Quentin 說json_encode
和.parseJSON
之間發生了一些事情,他是對的。
做一個alert(data.toSource());
給了我以下結果:
({response:"{\"logo_url\":\"http:\\/\\/storelocator.com\\/wp-content\\/uploads\\/gallery\\/7f\\/3b\\/71b9520cfc91a90afbdbbfc9d2b2239b_logo.jpeg\",\"img_id\":\"62\",\"feedback\":{\"message\":\"File uploaded\",\"success\":true}}", status:200})
這不是有效的 JSON。 它還添加了status:200
,我不知道這是從哪里來的。
可能是Plupload bind
對我返回的數據做了什么?
這是我的js腳本:
uploader.bind('FileUploaded', function(up, file, data) {
alert(data.toSource());
$('#' + file.id + " b").html("100%");
});
只需使用“JSON_UNESCAPED_SLASHES”選項(在 5.4 版后添加)。
json_encode($array,JSON_UNESCAPED_SLASHES);
我也剛剛在我的一些腳本中遇到了這個問題,它似乎正在發生,因為我將 json_encode 應用於包裝在另一個也是 json 編碼的數組中的數組。 如果在創建數據的腳本中有多個 foreach 循環,這很容易做到。 始終在最后應用 json_encode。
這就是正在發生的事情。 如果你這樣做:
$data[] = json_encode(['test' => 'one', 'test' => '2']);
$data[] = json_encode(['test' => 'two', 'test' => 'four']);
echo json_encode($data);
結果是:
["{\"test\":\"2\"}","{\"test\":\"four\"}"]
所以,你真正需要做的是:
$data[] = ['test' => 'one', 'test' => '2'];
$data[] = ['test' => 'two', 'test' => 'four'];
echo json_encode($data);
這將返回
[{"test":"2"},{"test":"four"}]
發生這種情況是因為 JSON 格式使用 ""(Quotes) 並且這些引號之間的任何內容都是有用的信息(鍵或數據)。
假設您的數據是: He said "This is how it is done".
那么實際數據應該看起來像"He said \\"This is how it is done\\"."
.
這確保\\"
被視為"(Quotation mark)
而不是 JSON 格式。 這稱為escape character
。
這通常發生在人們試圖對已經 JSON 編碼的數據進行編碼時,這是我見過這種情況的一種常見方式。
試試這個
$arr = ['This is a sample','This is also a "sample"']; echo json_encode($arr);
輸出:
["This is a sample","This is also a \"sample\""]
確保您的 php 腳本具有正確的標題,否則它將添加斜杠標題('Content-Type: application/json');
我有一個非常相似的問題,我有一個准備發布的數組。 在我的帖子功能中,我有這個:
json = JSON.stringfy(json);
這里的細節是我在 laravel 中使用刀片來構建一個三視圖表單,所以我可以前后移動,我在每個后退和前進按鈕驗證之間都有,當我在不重新加載頁面的情況下返回表單時json 被反斜杠填充。 我在每次驗證中使用console.log(json)
並意識到 json 被視為字符串而不是對象。
最后,我不應該分配json = JSON.stringfy(json)
而是將它分配給另一個變量。
var aux = JSON.stringfy(json);
這樣我將 json 作為一個對象,而不是一個字符串。
json_encode
將始終添加斜杠。
在此處查看手冊中的一些示例
這是因為如果有一些字符需要轉義,那么它們就會產生問題。
要使用 json,請解析您的 json 以確保刪除斜杠
好吧,無論您是否刪除斜杠, eval 都會毫無問題地解析 json。
<?php
$array = array('url'=>'http://mysite.com/uploads/gallery/7f/3b/f65ab8165d_logo.jpeg','id'=>54);
?>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
var x = jQuery.parseJSON('<?php echo json_encode($array);?>');
alert(x);
</script>
這是我的代碼,我能夠解析 JSON。
檢查您的代碼可能是您在解析 JSON 時遺漏了一些東西
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.