Intereting Posts
подключить gmail через php imap? ошибка сертификата локального эмитента Локальная страница не работает. Localhost перенаправляет вас слишком много раз. Laravel 5.3 Проверьте, существует ли значение HTML5 sessionStorage с PHP (например, с помощью файлов cookie) MySQL INTO OUTFILE переопределяет существующий файл? Могу ли я использовать хип-хоп Facebook с такими фреймворками, как Zend Framework, cakephp, symfony Есть ли способ запустить PHP-скрипт из MySQL? Разделить записи на две колонки Paypal API Express Checkout в PHP Код ошибки платежа 13113 Чтобы лучше понять переписку сеанса с двумя сеансовыми инициативами Как включить mod_rewrite в LAMP на ubuntu? Возврат данных обратно диспетчеру из наблюдателя событий в Magento PHPUnit :: получить сообщение: ОК, но неполные или пропущенные тесты! без какой-либо информации, где это происходит PHP Может static :: replace self ::? Ошибка загрузки файла PHP tmp_name Есть ли у PHP ответ на универсальные классы стиля Java?

php json_decode не работает без кавычек на ключе

У меня есть данные json, представленные как это

{key:"value"} 

(нет кавычек arround key …)

Я хочу перевести его в ассоциативный массив.

Json_decode PHP возвращает null

Как добавить цитаты вокруг ключа? благодаря…

Вы можете исправить JSON в источнике, чтобы он возвращал действительную структуру JSON, или вы можете вручную добавлять кавычки вокруг ключей.

Этот ответ на аналогичный вопрос имеет пример того, как это сделать:

 function my_json_decode($s) { $s = str_replace( array('"', "'"), array('\"', '"'), $s ); $s = preg_replace('/(\w+):/i', '"\1":', $s); return json_decode(sprintf('{%s}', $s)); } 

Если вы не можете включить это в действительный JSON в источнике, вы можете использовать Services_JSON из PEAR для его синтаксического анализа, поскольку добавление котировок вокруг ключа является нетривиальным процессом, подверженным ошибкам.

Services_JSON корректно проанализирует неверную строку ключа.

Пример:

 $json = new Services_JSON(); var_dump($json->decode('{key:"value"}')); 

Вывод:

 object(stdClass)#2 (1) { ["key"]=> string(5) "value" } 

Чтобы избежать двойных кавычек, вставлены в места, где они не должны, вы должны пропустить эти цитированные строки в этой манипуляции.

Например, если у вас есть этот литерал объекта JavaScript в строке:

 { dt:"2016-10-22T09:13:20", "x:y":false } 

… тогда следует позаботиться о том, чтобы не было 22T09: перейдите в "22T09": Также уже цитируемый ключ "x:y" должен оставаться неизменным.

Вы можете использовать это регулярное выражение для достижения этого:

 preg_replace('/("(.*?)"|(\w+))(\s*:\s*(".*?"|.))/s', '"$2$3"$4', $text); 

Другие вопросы

Объектные литералы JavaScript позволяют использовать числовые константы с нулевыми значениями слева, такими как 001 и / или с унарным знаком + , которые не разрешены в JSON. Чтобы удалить эти нарушающие символы, вы можете использовать эту расширенную версию:

 preg_replace('/("(.*?)"|(\w+))(\s*:\s*)\+?(0+(?=\d))?(".*?"|.)/s', '"$2$3"$4$6', $text); 

В соответствии с документацией (см. Пример № 3 – «распространенные ошибки с использованием json_decode»), ключи должны быть заключены в двойные кавычки.

Где вы получаете данные JSON?

Это сработало для меня, используя regex replace '/ \ s (\ w +) \ s / i'

 $json = file_get_contents("php://input"); // or whatever json data $json = preg_replace('/\s(\w+)\s/i', '"$1"', $json); $json = json_decode($json, true); 

Пожалуйста, не используйте регулярные выражения для этого! Грамматика JSON не может быть правильно проанализирована таким образом по определению. Вы откроете себе тонну будущих ошибок.

Я рекомендую использовать синтаксический анализатор YAML, потому что YAML является надмножеством JSON и позволяет одновременно использовать некотируемые литералы.

Компонент Symfony YAML отлично работает.

Будет штраф за производительность по сравнению с json_decode который будет реализован изначально.