Десериализация из JSON в PHP, с приведением? - PullRequest
19 голосов
/ 18 марта 2009

Предположим, у меня есть класс User со свойствами 'name' и 'password' и метод 'save'. При сериализации объекта этого класса в JSON через json_encode метод должным образом пропускается, и я получаю что-то вроде {'name': 'testName', 'password': 'testPassword'}.

Однако при десериализации с помощью json_decode я получаю объект StdClass вместо объекта User, что имеет смысл, но это означает, что у объекта отсутствует метод 'save'. Есть ли способ привести результирующий объект как пользователь или предоставить некоторую подсказку json_decode относительно того, какой тип объекта я ожидаю?

Ответы [ 12 ]

0 голосов
/ 12 мая 2010

Я должен сказать, что немного разочарован тем, что это не просто стандартная функциональность - какой-то библиотеки, если не самого JSON. Почему бы не вы хотели бы иметь по существу одинаковые объекты с обеих сторон? (В любом случае, насколько позволит JSON)

Я что-то здесь упускаю? Есть ли библиотека, которая делает это? (AFAICT, ни один из [thrift, буферов протокола, avro] на самом деле не имеет API для javascript. Для моей проблемы меня больше всего интересует JS <-> PHP, в некоторой степени также JS <-> python.)

0 голосов
/ 18 марта 2009

Чтобы ответить на ваш прямой вопрос, нет, не нужно было делать это с json_encode / json_decode. JSON был разработан и определен как формат для кодирования информации, а не для сериализации объектов. Функция PHP не выходит за рамки этого.

Если вы заинтересованы в воссоздании объектов из JSON, одним из возможных решений является статический метод для всех объектов вашей иерархии, который принимает строку stdClass / и заполняет переменные, которые выглядят примерно так

//semi pseudo code, not tested
static public function createFromJson($json){
    //if you pass in a string, decode it to an object
    $json = is_string($json) ? json_decode($json) : $json;

    foreach($json as $key=>$value){
        $object = new self();
        if(is_object($value)){
            $object->{$key} = parent::createFromJson($json);
        }
        else{
            $object->{$key} = $value;
        }
    }

    return $object;
}

Я не проверял это, но я надеюсь, что это поможет. В идеале все ваши объекты должны исходить от некоторого базового объекта (обычно называемого «класс объекта»), поэтому вы можете добавить этот код только в одном месте.

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