Поддерживает ли JSON «официально» преобразование собственных типов?

В PHP вы можете использовать json_encode для кодирования объекта в виде строки json.

$string = json_encode($some_object);

Тем не менее, PHP имеет стандартный набор типов данных, которые не считаются объектами (целые числа, строки и т. д.). Если вы передаете строку в json_encode, это возвращает строку, содержащую оператор javascript, который можно использовать для определения строки.

В менее неуклюжей формулировке это

echo json_encode("Hello 
world, please don't " . '"' . "misuse quote's for emphasis " .  "or possessive apostrophes' ");

выведет это (готовая строка javascript)

"Hello \n\tworld, please don't \"misuse quote'sor possessive apostrophes' "

Является ли такое поведение частью спецификации JSON? То есть определяет ли JSON или рекомендует, как реализация должна обрабатывать преобразование собственных, необъектных типов данных? Или вообще иметь мнение о конверсии? Мое чтение RFC оставило это неоднозначным, но я дерьмо при интерпретации этих вещей.

Я спрашиваю, потому что меня интересует вероятность того, что это поведение исчезнет из будущей версии функции. т. е. если это где-то кодифицировано в спецификации, вероятность того, что она исчезнет, ​​меньше, чем если бы она была единичной, которую кто-то решил добавить во время разработки.


person Alan Storm    schedule 22.01.2011    source источник


Ответы (2)


JSON вообще не заботится о нативных типах. От разработчика библиотеки или функций JSON зависит, как JSON транслируется в типы, которые язык программирования может использовать/понимать, и из них.

person Ignacio Vazquez-Abrams    schedule 22.01.2011
comment
Что ж, вынужден не согласиться. false — допустимое логическое значение, "false" — допустимая строка. Между тем, "foo" является допустимым логическим значением, а foo будет недопустимым JSON. И так далее. 0 будет целым числом, 0.0 числом с плавающей запятой и так далее. - person Dev_NIX; 24.05.2019

Вы правы, алан, RFC недостаточно ясен в этом вопросе.

С одной стороны, в ссылке на RFC, которую вы предоставляете, во втором абзаце введения говорится:

JSON может представлять четыре примитивных типа (строки, числа, логические значения и нуль) и два структурированных типа (объекты и массивы).

Но, с другой стороны, когда вы переходите к абзацу, в котором говорится о фактической грамматике JSON, он говорит:

Текст JSON — это сериализованный объект или массив.
JSON-текст = объект/массив.

Итак, основываясь на грамматике, вы можете сказать, что 'a string' не является допустимым текстом JSON.

Лично я бы предпочел, чтобы грамматика была «исправлена», чтобы сказать JSON-text = value, что сделало бы любой из false / null / true / object / array / number / string действительным текстом JSON.

Если вы хотите быть строгим на данный момент, я бы пошел с семантикой грамматики.

Я отправлю Дугласу Крокфорду ссылку на этот вопрос, возможно, он добавит какую-нибудь полезную информацию.

person epeleg    schedule 23.01.2011
comment
Хех, я уверен, что Даг доволен своим форматом как есть, но +1 за информацию, и спасибо! - person Alan Storm; 23.01.2011
comment
Я очень уважаю его, но, в конце концов, в RFC он указан как контролер изменений, так что я думаю, это означает, что изменения возможны. - person epeleg; 23.01.2011