У меня есть данные 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
который будет реализован изначально.