PHP json_decode () возвращает NULL с действующим JSON?

У меня есть этот объект JSON, хранящийся в текстовом файле:

{ "MySQL": { "Server": "(server)", "Username": "(user)", "Password": "(pwd)", "DatabaseName": "(dbname)" }, "Ftp": { "Server": "(server)", "Username": "(user)", "Password": "(pwd)", "RootFolder": "(rf)" }, "BasePath": "../../bin/", "NotesAppPath": "notas", "SearchAppPath": "buscar", "BaseUrl": "http:\/\/montemaiztusitio.com.ar", "InitialExtensions": [ "nem.mysqlhandler", "nem.string", "nem.colour", "nem.filesystem", "nem.rss", "nem.date", "nem.template", "nem.media", "nem.measuring", "nem.weather", "nem.currency" ], "MediaPath": "media", "MediaGalleriesTable": "journal_media_galleries", "MediaTable": "journal_media", "Journal": { "AllowedAdFileFormats": [ "flv:1", "jpg:2", "gif:3", "png:4", "swf:5" ], "AdColumnId": "3", "RSSLinkFormat": "%DOMAIN%\/notas\/%YEAR%-%MONTH%-%DAY%\/%TITLE%/", "FrontendLayout": "Flat", "AdPath": "ad", "SiteTitle": "Monte Maíz: Tu Sitio", "GlobalSiteDescription": "Periódico local de Monte Maíz.", "MoreInfoAt": "Más información aquí, en el Periódico local de Monte Maíz.", "TemplatePath": "templates", "WeatherSource": "accuweather:SAM|AR|AR005|MONTE MAIZ", "WeatherMeasureType": "1", "CurrencySource": "cotizacion-monedas:Dolar|Euro|Real", "TimesSingular": "vez", "TimesPlural": "veces" } } 

Когда я пытаюсь декодировать его с помощью json_decode() , он возвращает NULL. Зачем? Файл читается (я пробовал эхо file_get_contents() и он работал нормально).

Я тестировал JSON против http://jsonlint.com/, и это совершенно верно.

Что здесь не так?

Решение

Ищете ответы на Google, я вернулся к SO: json_decode возвращает NULL после вызова webservice . В моем файле JSON была последовательность UTF BOM (некоторые двоичные символы, которые не должны быть там), таким образом, нарушая структуру JSON. Пошел в Hex Editor, удалил байты. Все в порядке. Почему это произошло? Потому что я редактировал файл с помощью Microsoft Windows 'Notepad. Ужасная идея!

Это может быть кодировка специальных символов. Вы можете запросить json_last_error (), чтобы получить определенную информацию.

Обновление: проблема решена, посмотрите на пункт «Решение» в вопросе.

Это сработало для меня

 json_decode( preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $json_string), true ); 

Если вы проверите запрос в chrome, вы увидите, что JSON – это текст, поэтому в JSON был добавлен пустой код.

Вы можете очистить его, используя

$k=preg_replace('/\s+/', '',$k);

Затем вы можете использовать:

json_decode($k)

Затем print_r покажет массив.

У меня была та же проблема, и я решил это просто, заменив символ цитаты перед декодированием.

 $json = str_replace('"', '"', $json); $object = json_decode($json); 

Значение JSON было создано функцией JSON.stringify.

 $k=preg_replace('/\s+/', '',$k); 

сделал это для меня. И да, тестирование в Chrome. Thx to user2254008

Вы можете попробовать.

 json_decode(stripslashes($_POST['data'])) 

Возможно, некоторые скрытые персонажи возились с вашим json, попробуйте это:

 $json = utf8_encode($yourString); $data = json_decode($json); 

Просто подумал, что я добавлю это, так как я столкнулся с этим вопросом сегодня. Если в вашей строке JSON есть строка, json_decode вернет NULL.

Если вы вытаскиваете JSON из источника, отличного от переменной PHP, было бы разумно сначала «обрезать» его:

 $jsonData = trim($jsonData); 

Как указано Jürgen Math, используя метод preg_replace, указанный пользователем2254008, он исправил его и для меня.

Это не ограничивается Chrome, это проблема с преобразованием набора символов (по крайней мере, в моем случае, Unicode -> UTF8). Это фиксировало все проблемы, которые у меня были.

Будучи узлом будущего, JSON Object i был декодированием, поступал из функции json.dumps Python. Это, в свою очередь, привело к тому, что некоторые другие антисанитарные данные пробились, хотя с этим легко справились.

Если вы получаете json из базы данных, поставьте

 mysqli_set_charset($con, "utf8"); 

после определения ссылки соединения $ con

Просто сэкономить один раз. Я потратил 3 часа, чтобы узнать, что это просто проблема с кодировкой html. Попробуй это

 if(get_magic_quotes_gpc()){ $param = stripslashes($row['your column name']); }else{ $param = $row['your column name']; } $param = json_decode(html_entity_decode($param),true); $json_errors = array( JSON_ERROR_NONE => 'No error has occurred', JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', JSON_ERROR_SYNTAX => 'Syntax error', ); echo 'Last error : ', $json_errors[json_last_error()], PHP_EOL, PHP_EOL; print_r($param); 

Я решил эту проблему, распечатав JSON, а затем проверив источник страницы (CTRL / CMD + U):

 print_r(file_get_contents($url)); 

Оказалось, что существует трейлинг- <pre> .

это поможет вам понять, каков тип ошибки

 <?php // A valid json string $json[] = '{"Organization": "PHP Documentation Team"}'; // An invalid json string which will cause an syntax // error, in this case we used ' instead of " for quotation $json[] = "{'Organization': 'PHP Documentation Team'}"; foreach ($json as $string) { echo 'Decoding: ' . $string; json_decode($string); switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - No errors'; break; case JSON_ERROR_DEPTH: echo ' - Maximum stack depth exceeded'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Underflow or the modes mismatch'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Unexpected control character found'; break; case JSON_ERROR_SYNTAX: echo ' - Syntax error, malformed JSON'; break; case JSON_ERROR_UTF8: echo ' - Malformed UTF-8 characters, possibly incorrectly encoded'; break; default: echo ' - Unknown error'; break; } echo PHP_EOL; } ?> 

вы должны обеспечить эти пункты

1. Ваша строка json не имеет никаких неизвестных символов

2. json string может просматривать из онлайн-просмотра json (вы можете искать в google как онлайн-просмотрщик или парсер для json), он должен просматривать без какой-либо ошибки

3. ваша строка не содержит html-сущностей, она должна быть простым текстом / строкой

для объяснения пункта 3

 $html_product_sizes_json=htmlentities($html); $ProductSizesArr = json_decode($html_product_sizes_json,true); 

to (удалить функцию htmlentities ())

 $html_product_sizes_json=$html; $ProductSizesArr = json_decode($html_product_sizes_json,true); 

Здесь вы можете найти небольшую оболочку JSON с корректирующими действиями, которые касаются спецификации и не-ASCI-проблемы: https://stackoverflow.com/a/43694325/2254935

 <?php $json_url = "http://api.testmagazine.com/test.php?type=menu"; $json = file_get_contents($json_url); $json=str_replace('}, ]',"} ]",$json); $data = json_decode($json); echo "<pre>"; print_r($data); echo "</pre>"; ?>