Как контролировать поведение json_encode? - PullRequest
9 голосов
/ 08 января 2012

Есть ли способ контролировать поведение json_encode на объектах?Как исключение пустых массивов, пустых полей и так далее?

Я имею в виду что-то вроде использования serialize(), где вы можете реализовать магический метод __sleep() и указать, какие свойства должны быть сериализованы:

class MyClass
{
   public $yes   = "I should be encoded/serialized!";
   public $empty = array(); // // Do not encode me!
   public $null  = null; // Do not encode me!

   public function __sleep() { return array('yes'); }
}

$obj = new MyClass();
var_dump(json_encode($obj));

Ответы [ 2 ]

5 голосов
/ 04 января 2014

Наиболее правильным решением является расширение интерфейса JsonSerializable;

, используя этот интерфейс, вам просто нужно вернуться с функцией jsonSerialize () что вы хотите json_encodeкодировать вместо вашего класса.

Используя ваш пример:

class MyClass implements JsonSerializable{

   public $yes   = "I should be encoded/serialized!";
   public $empty = array(); // // Do not encode me!
   public $null  = null; // Do not encode me!

   function jsonSerialize() {
           return Array('yes'=>$this->yes);// Encode this array instead of the current element
   }
   public function __sleep() { return array('yes'); }//this works with serialize()
}

$obj = new MyClass();
echo json_encode($obj); //This should return {yes:"I should be encoded/serialized!"}

Примечание: это работает в php> = 5.4 http://php.net/manual/en/class.jsonserializable.php

0 голосов
/ 13 января 2012

Вы можете сделать переменные приватными.Тогда они не будут отображаться в кодировке JSON.

Если это не вариант, вы можете создать приватный массив и использовать магические методы __get ($ key) и __set ($ key, $ value) для установки и получения значений в / из этого массива.В вашем случае ключи будут «пустыми» и «нулевыми».После этого вы все равно можете получить к ним доступ публично, но кодировщик JSON не найдет их.

class A
{
    public $yes = "...";
    private $privateVars = array();
    public function __get($key)
    {
        if (array_key_exists($key, $this->privateVars))
            return $this->privateVars[$key];
        return null;
    }
    public function __set($key, $value)
    {
        $this->privateVars[$key] = $value;
    }
}

http://www.php.net/manual/en/language.oop5.overloading.php#object.get

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