2013-09-12 2 views
0

при попытке следующее в PHP:Что должно быть возвращено json_decode ("true")?

var_dump(json_decode("123")); 

var_dump(json_decode("true")); 

, что я ожидаю:

NULL 

NULL 

но то, что я на самом деле получаю:

int(123) 

bool(true) 

В случае, если "123" и «истинный "считаются действительными строк JSON? Или это ошибка в реализации json_decode()?

Спасибо.

+2

Зачем 'json_encode/json_decode' неудачу на не-массив стоимость? – DiMono

+0

в соответствии с [PHP Manual] (http://php.net/manual/en/function.json-decode.php), NULL возвращается, если json не может быть декодирован или если кодированные данные глубже предела рекурсии. Я думаю, что «123» не является допустимым форматом JSON, поэтому он должен потерпеть неудачу. Правильно ли мое понимание? –

+1

@DiMono - * Текст JSON - это сериализованный объект или массив. * - [Спецификация JSON] (http://www.ietf.org/rfc/rfc4627.txt) – Quentin

ответ

1

Недействительные тексты JSON, но функция json_decode документирована как способная обрабатывать фрагменты JSON.

0

Оба результата являются правильными.

string(4) "true" 

как строка JavaScript следует преобразовать обратно в bool (true). То же самое касается строки (3) «123».

1

Помните, что JSON является в основном просто javascript и является буквально просто текстовой строкой. Оба PHP и Javascript имеют true и false константы:

php > var_dump(json_decode(true)); // php constant "true", maps to int 1 
int(1) 
php > var_dump(json_decode('true')); // php string/javascript constant true 
bool(true) 
php > var_dump(json_decode('"true"')); // json-encoded string "true" 
string(4) "true" 

Ваш "123" может быть PHP строку, что приводит к некоторым странностям:

php > var_dump(json_encode(123)); 
string(3) "123" 
php > var_dump(json_encode("123")); 
string(5) ""123"" // not quite what you'd expect. 
php > var_dump(json_encode('123')); 
string(5) ""123"" // also somewhat unexpected 


php > var_dump(json_decode(123)); 
int(123) 
php > var_dump(json_decode('123')); 
int(123) 
php > var_dump(json_decode('"123"')); 
string(3) "123" 
Смежные вопросы