Почему функция php json декодирует сбой, если строка содержит слово, не определенное в качестве значения?
У меня есть эта строка, которая генерируется функцией dojo.toJSON():
{"page":"accommodation task=viewList","language":undefined}
При декодировании его с помощью json_decode в php он возвращает значение null.
Я уже понял, что это вызвано неопределенным значением, но я не уверен, следует ли этого ожидать или это ошибка. Является ли приведенная выше строка недопустимым json? Почему php не может просто преобразовать undefined в null?
Я использую PHP 5.2.10
2 answers
Потому что undefined
недопустимо JSON. В JSON нет концепции JavaScript undefined
. У него есть null
, что смутно похоже, но обычно (к лучшему или худшему) просто опускают свойства, значения которых были бы undefined
.
Я удивлен, если Додзе toJson
выдает такой недопустимый JSON. Вы могли бы рассмотреть возможность использования Крокфорда JSON.stringify
вместо этого. Если Додзе toJson
действительно делает это, я бы сообщил об этом как об ошибке в Додзе команда.
Обновление: По-видимому, кто-то сообщил ли об этом им, и они закрыли его как недействительный по теории "мусор входит, мусор выходит". Не мой проект, но это просто полностью не, как я бы обрабатывал свойства со значениями undefined
... Я бы опустил их или сделал исключение.
Обновление 2: Как вы, возможно, знаете, спецификация ECMAScript 5-го издания определяет объект JSON
с parse
и stringify
, которые добавляют браузеры поддержка для. Определение спецификации JSON.stringify
гласит "undefined
значения не отображаются" (Раздел 15.12.3, Примечание 2) - например, свойство следует опустить. Возможно, если вы укажете на это команде Dojo, они пересмотрят свой ответ GIGO на сообщение об ошибке. Также обратите внимание на комментарий @Felix ниже: они опускают ссылки на функции, которые также не могут быть достоверно представлены в JSON, но применяют другое правило к undefined
.
Обновление 3: Все еще сломано в Dojo 1.6.1. Вот живой тест версии v1.6.0, который является последним на CDNS. Я также протестировал версию v1.6.1, и там она тоже все еще сломана. (Не собираюсь размещать тестовую страницу с горячей ссылкой на их раздел загрузки, хотя это было бы грубо.)
Вы можете преобразовать значение undefined в null в PHP на стороне сервера, что устраняет непосредственную проблему:
<?php
$json = '{"page":"accommodation task=viewList","language":undefined,"example": "This is an example of an occurence of undefined that remains"}';
$json = preg_replace(
'~undefined(?=(?:[^"]*"[^"\\\\]*(?:\\\\.[^"\\\\]*)*")*[^"]*$)~', 'null', $json
);
var_dump( json_decode( $json ) );
Однако лучшим решением было бы убедиться, что "неопределенный" не появится в JSON, так как он действительно недействителен.