Почему функция php json_decode не работает, если строка содержит слово undefined в качестве значения? - PullRequest
2 голосов
/ 31 мая 2011

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

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 31 мая 2011

Поскольку undefined недопустимо JSON .JSON не имеет концепции JavaScript undefined.У него есть null, что неопределенно похоже, но обычно (к лучшему или к худшему) просто опускают свойства, значения которых будут undefined.

Я удивляюсь, если у Додзё toJsonпроизводит недопустимый JSON, как это.Вы можете рассмотреть возможность использования Крокфорда JSON.stringify.Если Dojo toJson действительно делает это, я бы сообщил об этом команде Dojo как об ошибке.

Обновление : очевидно, кто-то сделал отчетэто для них , и они закрыли его как недействительный по теории «мусор в мусоре».Не мой проект, но это просто , а не , как я буду обрабатывать свойства со значениями undefined ... Я бы их пропустил или выкинул исключение.

Обновление 2 : Как вы, возможно, знаете, спецификация ECMAScript 5-го издания определяет объект JSON с parse и stringify, для которых браузеры добавляют поддержку.Определение спецификации JSON.stringify гласит: «undefined значения не отображаются» (раздел 15.12.3, примечание 2) - например, свойство должно быть опущено.Возможно, если вы укажете это команде Dojo, они пересмотрят свой ответ GIGO на сообщение об ошибке.Также обратите внимание на комментарий Феликса ниже: они опускают ссылки на функции, которые также не могут быть корректно представлены в JSON, но применяют другое правило к undefined.

Обновление 3 : все еще не работаетв додзё 1.6.1.Вот живой тест v1.6.0, который является последним на CDN.Я также протестировал v1.6.1, и он все еще там сломан.(Не собираюсь публиковать тестовую страницу, содержащую ссылки на их раздел загрузки, это было бы грубым.)

0 голосов
/ 31 мая 2011

Вы можете преобразовать 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 ) );

Хотя лучшим решением было бы убедиться, что 'undefined' не появится в JSON, поскольку это - действительно - недействительно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...