У меня есть этот объект 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>"; ?>