簡體   English   中英

為什么 json_encode 添加反斜杠?

[英]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 添加斜杠?

當嵌入到 HTML 腳本元素中時,正斜杠字符可能會導致問題(當前面帶有<時會觸發“腳本元素結束”的 SGML 規則)。 他們被逃脫作為預防措施。

因為當我嘗試使用 jQuery.parseJSON(response); 在我的 js 腳本中,它返回 null。 所以我猜這與斜線有關。

它沒有。 在 JSON 中, "/""\\/"是等價的。

您在問題中列出的 JSON 是有效的(您可以使用jsonlint對其進行測試)。 您的問題可能與json_encodeparseJSON之間發生的事情有關。

我也剛剛在我的一些腳本中遇到了這個問題,它似乎正在發生,因為我將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM