Странное поведение: json_encode () создает неверный json в зависимости от ввода - PullRequest
2 голосов
/ 08 марта 2012

сегодня мне пришлось столкнуться с каким-то странным поведением php json_encode () , о котором я нигде не читал.

Короче говоря:

  1. Извлечение строки из базы данных
  2. Создание stdClass -объекта и хранение там некоторых данных
  3. Кодирование с использованием json_encode ()

    $obj = new stdClass();
    $obj->a = "foo";
    $obj->b = "bar";
    $obj->c = "doo";
    $obj->d = "baa";
    json_encode( $obj );
    

Проблема:

Возвращенный JSON содержит ошибку: вторая (последняя, ​​но только эта!) Переменная была объединена со строковым значением предыдущего.

Например, это выглядело так:

{"a": "foo", "b": "bar", "c": "doo', 'd': 'baa"}
                                  ^-------^

Конечно, у меня есть var_dumped () объект, который я передаю json_encode () ... ничего! Все было хорошо и именно так, как и ожидалось. Все переменные были правильными, а все значения были строками.

Но хорошо, этого недостаточно. Поэкспериментировав с этим, я обнаружил, что изменение порядка хранения значений в объекте решило проблему:

$obj->d = "baa";
$obj->c = "doo";

Не выдал ошибку.

Пока я просто изменил порядок столбцов таблицы базы данных. Но я хотел бы знать, откуда эта невидимая ошибка, и в конечном итоге сообщить о ней.

Ошибка появилась только на виртуальной машине Debian с PHP 5.3.6. Другая виртуальная машина, работающая на PHP 5.3.3, выдает правильный JSON, как и встроенный веб-сервер Mac OS X Lion, работающий на PHP 5.3.8.

Мой вопрос

Кто-нибудь тоже сталкивался с этой проблемой?

Привет из Германии!

Оригинальный код

$obj = new stdClass();
$obj->Id = '35';
$obj->EventsCategories_Id = '8';
$obj->Name = 'Blubber';
$obj->OrderValue = '2';
var_dump($obj);
json_encode($obj);

1 Ответ

0 голосов
/ 13 марта 2012

Я понятия не имею, поможет ли это или нет, но выполнение следующего кода дает какие-либо иные результаты?

$obj = new stdClass();
$obj->Id = '35';
$obj->EventsCategories_Id = '8';
$obj->Name = 'Blubber';
$obj->OrderValue = '2';

// convert the stdClass object to an array
$obj = (array) $obj;
var_dump($obj);
json_encode($obj);

Я думаю, что уместный вопрос, который нужно задать, это:

  • внутренняя проблема PHP (возможно, но маловероятно)
  • проблема, возникающая из-за какой-то проблемы с окружающей средой (конфликтующая библиотека?)
  • отсутствующая опция конфигурации

Хотя я очень сомневаюсь, что вы сделали что-то не так (я имею в виду, что это простой вариант использования и в вашем коде нет ничего плохого), возможно, вы могли бы попробовать пару других вещей ...

Например, попробуйте добавить второй аргумент к функции json_encode:

echo json_encode($obj, JSON_FORCE_OBJECT);

Не могли бы вы опубликовать результаты этих двух коротких экспериментов?Эта проблема действительно странная.Я использую PHP 5.3.1, и он генерирует синтаксически правильный JSON на основе вашего примера - никаких проблем для отчета.

...