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 (некоторые двоичные символы, которых не должно быть), таким образом, нарушая структуру JSON. Зашел в шестнадцатеричный редактор, стер байты. Все возвращается на круги своя. Почему это произошло? потому что я редактировал файл с помощью блокнота Microsoft Windows. ужасная идея!
16 ответов:
Это может быть кодировка специальных символов. Вы могли бы спросить 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)
покажет время.
У меня была та же проблема, и я решил ее просто заменив символ кавычки перед декодированием.
$json = str_replace('"', '"', $json); $object = json_decode($json);
мое значение JSON было сгенерировано JSON.функция преобразовать в строки.
возможно, некоторые скрытые символы возятся с вашим json, попробуйте это:
$json = utf8_encode($yourString); $data = json_decode($json);
$k=preg_replace('/\s+/', '',$k);
сделал это для меня. И да, тестирование на Chrome. Thx для пользователя 2254008
просто подумал, что я добавлю это, как я столкнулся с этой проблемой сегодня. Если есть какие-либо строки заполнения вокруг строки JSON, json_decode вернет NULL.
Если вы вытаскиваете JSON из источника, отличного от переменной PHP, было бы разумно сначала "обрезать" его:
$jsonData = trim($jsonData);
Как заявил Юрген математика, используя метод preg_replace, указанный user2254008, исправил его и для меня.
Это не ограничивается Chrome, это, кажется, проблема преобразования набора символов (по крайней мере, в моем случае, Unicode -> UTF8) это исправило все проблемы, которые у меня были.
как будущий узел, объект JSON, который я декодировал, пришел из JSON Python.функция дампов. Это, в свою очередь, вызвало некоторые другие антисанитарные данные, чтобы сделать его поперек, хотя это было легко справиться с.
Если вы получаете json из базы данных, put
mysqli_set_charset($con, "utf8");
после определения соединения link $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);
это поможет вам понять, какой тип ошибки
<?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; } ?>
здесь вы можете найти небольшую оболочку JSON с корректирующими действиями, которые касаются проблемы BOM и не-ASCI:https://stackoverflow.com/a/43694325/2254935
Я решил эту проблему, распечатав JSON, а затем проверив источник страницы (CTRL / CMD + U):
print_r(file_get_contents($url));
оказалось, там был трейлинг
<pre>
тег.
вы должны обеспечить эти пункты
1. ваша строка json не имеет каких-либо неизвестных символов
2. строка json может просматривать из онлайн-просмотра json (вы можете искать в google как онлайн-просмотрщик или парсер для json) он должен просматривать без каких-либо ошибок
3. ваша строка не имеет HTML-объектов, она должна быть простым текстом / строкой
для разъяснения пункта 3
$html_product_sizes_json=htmlentities($html); $ProductSizesArr = json_decode($html_product_sizes_json,true);
до (удалить функцию htmlentities ())
$html_product_sizes_json=$html; $ProductSizesArr = json_decode($html_product_sizes_json,true);