[英]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_ex
,php_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)
);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.