Привет, у меня есть следующая проблема, когда в некоторых случаях json_decode не работает, и я получаю пустой массив следующим образом.
// for test purpose set the inbound enc parameter $_POST["enc"] = "eyJ0cmFuc2NyaXB0IjoiLSAgICAgICAgICBQYXN0ZWQgdGhlIHRleHQgaW50byBOb3RlcGFkIBMgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIiwiaWQiOjcwLCJpc0FjdGlvbmVkIjp0cnVlLCJ1c2VyX2lkIjoxLCJ0YXNrX3R5cGVfaWQiOjEsImFjY291bnRfaWQiOjIxLCJhY2NvdW50X25hbWUiOiJURVNUIiwiZXZlbnRfZGF0ZSI6bnVsbH0="; $decoded = base64_decode($_POST["enc"]); $ar = (array)json_decode($decoded); echo "<pre>"; print_r($decoded); echo "</pre>"; echo "<pre>"; print_r($ar); echo "</pre>";
$decoded
отображается как строка json, но $ar
имеет значение null
.
Любая помощь, пожалуйста, будет оценена, помогая мне в этом вопросе.
Принимая ваш код и расшифровывая строчную кодировку Base64, оказывается, что у вас есть символ ASCII CHR(13)
в ваших данных JSON, что приводит к отказу JSON от проверки в соответствии с JSON Lint . Взятие этого символа приводит к правильному анализу JSON.
PHP Fiddle
Декодированные данные JSON:
{ "transcript": "- Pasted the text into Notepad no special characters", "id": 70, "isActioned": true, "user_id": 1, "task_type_id": 1, "account_id": 21, "account_name": "TEST", "event_date": null }
HEX Редактор Скриншот:
Ошибка в вашем JSON
– как ни странно, в двух пробелах между «Блокнотом» и «Нет».
Похоже, что между этими пространствами существует нестандартный символ. Удалите этот символ, и JSON действителен.
Инвалид
{"transcript":"- Pasted the text into Notepad no special characters","id":70,"isActioned":true,"user_id":1,"task_type_id":1,"account_id":21,"account_name":"TEST","event_date":null}
действительный
{"transcript":"- Pasted the text into Notepad no special characters","id":70,"isActioned":true,"user_id":1,"task_type_id":1,"account_id":21,"account_name":"TEST","event_date":null}
В будущем вы идеально использовали бы json_encode
для создания строки JSON
. Функция автоматически удалит любые недействительные символы для вас.
Вы не предоставили второй параметр в json_decode
для возврата в качестве массива, а не для объекта
// for test purpose set the inbound enc parameter $_POST["enc"] = "eyJ0cmFuc2NyaXB0IjoiLSAgICAgICAgICBQYXN0ZWQgdGhlIHRleHQgaW50byBOb3RlcGFkIBMgbm8gc3BlY2lhbCBjaGFyYWN0ZXJzIiwiaWQiOjcwLCJpc0FjdGlvbmVkIjp0cnVlLCJ1c2VyX2lkIjoxLCJ0YXNrX3R5cGVfaWQiOjEsImFjY291bnRfaWQiOjIxLCJhY2NvdW50X25hbWUiOiJURVNUIiwiZXZlbnRfZGF0ZSI6bnVsbH0="; $decoded = base64_decode($_POST["enc"]); $ar = json_decode($decoded, true); //<-- Now returned as an array, and not an object echo "<pre>"; print_r($decoded); echo "</pre>"; echo "<pre>"; print_r($ar); echo "</pre>";
Вывод
{"transcript":"- Pasted the text into Notepad no special characters","id":70,"isActioned":true,"user_id":1,"task_type_id":1,"account_id":21,"account_name":"TEST","event_date":null}