<rmcreative>

RSS

JsonSerializable

3 июня 2010

И ещё одна довольно интересная штука, попавшая в транк PHP. На этот раз речь о json_encode. Как известно, он отлично работает с массивами и даже работает с объектами. Вот с объектами как раз тут не всё так просто: возможно необходимо сделать какую-то предварительную обработку или выкинуть часть свойств.

В последнем коде можно сделать так:

class MyObject implements JsonSerializable {
  private $test1, $test2;
  public $x = 10;
 
  function __construct($test1, $test2) {
    $this->test1 = $test1;
    $this->test2 = $test2;
  }
 
  // json_encode будет работать с результатом этого метода
  function jsonSerialize(){    
    return array($this->x, $this->test1);
  }
}

Комментарии RSS

  1. №2614
    Сергей
    Сергей 04 июня 2010 г., 21:15:09

    Можно попросить разжевать на примере?

  2. №2615
    stalker
    stalker 06 июня 2010 г., 15:39:04

    Очередной пусто-порожний велосипед .. что сейчас мешает делать вызов: json_encode($object->jsonSerialize()) ? Вместо этого хардкодят очередное название функции. Хоть бы уж вводили __serialize() и вызывалась она **всеми** системами сериализации.

  3. №2618
    Psih
    Psih 08 июня 2010 г., 16:57:37

    Stalker

    Во тут вы не правы, т.к. сериализация обычная (serialize()) как правило сохраняет объект к кеш или ещё что-нить в этом роде, т.е. как правило сериализуется и десереализуется оно в приложении. JSON же может свободно уйти куда-то во вне - MongoDB, браузер (AJAX запрос), etc. Так что какраз, ИМХО, правильное решение.

  4. №2619
    Psih
    Psih 08 июня 2010 г., 16:58:30

    Только не понятно, почему не __jsonSerialize()

  5. №4899
    JhaoDa
    JhaoDa 30 июня 2011 г., 18:33:12

    Потому что это не magic method, а имплементированная функция интерфейса.

  6. №4920
    .rathil
    .rathil 07 июля 2011 г., 10:51:34

    Частично согласен с stalker, не вижу смысла с этой ф-ции, ее можно и самому сделать. Слип работает корректно, ты возвращаешь массив ИМЕН полей которые нужно серелезовать, а тут что? Возвращается массив полей, тоесть ничего нативного тут я не вижу...

  1. Почта опубликована не будет.

  2. Можно использовать синтаксис Markdown или HTML.

  3. Введите ответ в поле. Щёлкните, чтобы получить другую задачу.