簡體   English   中英

如何對從JavaScript接收到的json數組進行json_decode?

[英]How to json_decode an json array received from JavaScript?

我想將json字符串編碼的數據發送到PHP后端。 為此,我使用的是GET參數表,其中包含URL編碼的json數據,其格式如下: ["mystring1","mystring2"]

現在,當我嘗試使用php的json_decode函數對其進行解碼時,它返回null 而且,使用此輸入字符串,根本不會更改任何內容: {"mykey":["mystring1","mystring2"]}

這是我的完整代碼示例:

JavaScript:

var myArr = [];
myArr.push('mystring1');
myArr.push('mystring2');
window.location.href = 'example.com/index.php?myparam=' + encodeURIComponent(JSON.stringify(myArr));

PHP后端網站:

$jsonStr = filter_input(\INPUT_GET, 'myparam', \FILTER_SANITIZE_STRING);
var_dump($jsonStr);
var_dump(json_decode($jsonStr, true));

第一個var_dump正確打印json字符串,第二個返回null 使用assoc標志(第二個json_encode參數)不會更改任何內容。

我期望得到什么:

array(2) { [0]=> string(9) "mystring1" [1]=> string(9) "mystring2" }

我實際得到的是:

NULL

$jsonStr var_dump為我返回以下內容:

string(41) "["mystring1","mystring2"]"

我正在轉移FILTER_SANITIZE_STRING的功能中的注釋 但是該問題中的所有公認答案都可以更好地說明這一點:

首先php_filter_strip 它並沒有做太多事情,只是獲取傳遞給函數的標志並進行相應處理。 它做有據可查的東西。

然后,我們構造某種地圖並調用php_filter_encode_html 更有意思: 它將ASCII碼小於32且大於127的字符“,”,&和chars轉換為HTML實體,因此&在您的字符串中變為& 。再次為此使用標志。

然后我們調用php_strip_tags_exphp_strip_tags_ex剝離HTML,XML和PHP標記(根據/ext/standard/string.c中的定義)並刪除NULL字節,如注釋中所述。

(強調了重要部分)。

簡而言之, FILTER_SANITIZE_STRING將破壞您的JSON,因為它將對不應該編碼的東西進行編碼。 如果要驗證此輸入,請不要使用此過濾器。

答案是不要使用FILTER_SANITIZE_STRING 驗證JSON字符串的明智方法是執行json_decode並檢查其是否為null。

$jsonStr = filter_input(\INPUT_GET, 'myparam'); 
var_dump($jsonStr); 
var_dump(json_decode($jsonStr, true)); 

這里的錯誤與JSON無關,而在於使用編碼的URI組件的請求中。

如果您在JS端使用encodeURIComponent ,則還必須在PHP端使用urldecode

<?php
$jsonStr = '%5B%22mystring1%22%2C%22mystring2%22%5D';
var_dump(
    json_decode(urldecode($jsonStr), true)
);

請參閱: http//php.net/manual/en/function.urldecode.php

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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