Почему функция php json декодирует сбой, если строка содержит слово, не определенное в качестве значения?


У меня есть эта строка, которая генерируется функцией dojo.toJSON():

{"page":"accommodation task=viewList","language":undefined}

При декодировании его с помощью json_decode в php он возвращает значение null.

Я уже понял, что это вызвано неопределенным значением, но я не уверен, следует ли этого ожидать или это ошибка. Является ли приведенная выше строка недопустимым json? Почему php не может просто преобразовать undefined в null?

Я использую PHP 5.2.10

Author: jgivoni, 2011-05-31

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, и там она тоже все еще сломана. (Не собираюсь размещать тестовую страницу с горячей ссылкой на их раздел загрузки, хотя это было бы грубо.)

 8
Author: T.J. Crowder, 2011-05-31 09:30:52

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

 0
Author: Berry Langerak, 2011-05-31 09:26:29