2012-01-08 2 views
8

Есть ли способ управления json_encode Поведение объектов? Как исключить пустые массивы, нулевые поля и т. Д.?Как управлять поведением 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)); 

ответ

0

Вы могли бы сделать переменные частные. Тогда они не будут отображаться в кодировке 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

+0

Да, я знаю, что, но спасибо за ответ. Проблема в том, что когда B расширяет A, B не может изменить '$ privateVars' и сделать его' private'. – gremo

+1

Сделал бы это защитой работы? Почему бы B сделать private private приватным, он уже закрыт. – Jarvix

6

Наиболее правильное решение расширяет интерфейс 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

С помощью этого решения «пустые» и «нулевые» не будут закодированы, если их значения не являются пустым массивом или нулями. Я считаю, что это не то, чего хотел искатель. –

Смежные вопросы