php5.4 JsonSerializable

9 Мар
2012

В прошлом посту я сказал что очень ждал php 5.4 потому, что в нем появляется интерфейс JsonSerializable

Так почему я его ждал?

Напишем простой класс, с Magic методами.

class Book {
    protected $_data = array();
    public function __get($key) {
        $key = strtolower($key);
        if (array_key_exists($key, $this->_data)) {
            return $this->_data[$key];
        } else {
            return null;
        }
    }
    public function __set($key, $value) {
        $key = strtolower($key);
        $this->_data[$key] = $value;
    }
}


Название класса, как бы намекает что он используется для объектов типа книга. Наша первая книга:

<?php
$book = new Book();
$book->id = 1;
$book->title = 'Hello php5.4';

Теперь преобразуем наш объект книги в json и для усложнения задачи будем преобразовывать массив объектов.

<?php
$book = new Book();
$book->id = 1;
$book->title = 'Hello world1';

$book1 = new Book();
$book1->id = 2;
$book1->title = 'Hello php';

$bookCollection = array($book, $book1);

require_once 'Zend/Json.php';
echo 'json_encode: '.json_encode($bookCollection).PHP_EOL;
echo 'Zend_Encode:' .Zend_Json::encode($bookCollection).PHP_EOL;

Результат этого кода:

json_encode: [{},{}]
Zend_Encode:[{},{}]

Как-то не красиво. Реализуем наш класс, через интерфейс JsonSerializable. Для этого понадобиться к классу добавить метод jsonSerialize.

class Book implements JsonSerializable{
	protected $_data = array();

    public function __get($key) {
        $key = strtolower($key);
        if (array_key_exists($key, $this->_data)) {
            return $this->_data[$key];
        } else {
            return null;
        }
    }

    public function __set($key, $value) {
        $key = strtolower($key);
        $this->_data[$key] = $value;
    }
    public function jsonSerialize() {
        $obj = new stdClass();
        foreach ($this->_data as $key=>$value) {
            $obj->{$key} = $value;
        }
        return $obj;
    }
}

Запустив еще раз скрипт получается такой вывод:

json_encode: [{"id":1,"title":"Hello world1"},{"id":2,"title":"Hello php"}]
Zend_Encode:[{"id":1,"title":"Hello world1"},{"id":2,"title":"Hello php"}]

Теперь все ок.

1 комментарий к записи php5.4 JsonSerializable

Avatar

Adel Shigabutdinov

9th Март 2012 в 21:47

Спасибо. Теперь стало понятно для чего это.

Оставить комментарий или два

Наверх
Rambler's Top100