2012-01-08 14 views
8

¿Hay alguna forma de controlar el comportamiento de json_encode en los objetos? ¿Como excluir matrices vacías, campos nulos, etc.?¿Cómo controlar el comportamiento de json_encode?

que quiere decir algo así como cuando se utiliza serialize(), donde se puede poner en práctica la magia método __sleep() y especificar qué propiedades deben ser serializados:

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)); 

Respuesta

0

usted podría hacer las variables privado. Entonces no aparecerán en la codificación JSON.

Si esa no es una opción, podría hacer una matriz privada y usar los métodos mágicos __get ($ key) y __set ($ key, $ value) para establecer y obtener valores en/desde esta matriz. En su caso, las claves serían 'vacío' y 'nulo'. A continuación, puede acceder a ellos públicamente pero el codificador JSON no los encontrará.

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

sí, ya sé eso, pero gracias por la respuesta. El problema es cuando B extiende A, B no puede modificar '$ privateVars' y lo convierte' privado'. – gremo

+1

¿Sería un trabajo protegido? ¿Por qué B haría privado $ PrivateVars, ya es privado. – Jarvix

6

La solución más correcta es la ampliación de la interfaz JsonSerializable;

mediante el uso de esta interfaz sólo tiene que volver con la función jsonSerialize() lo que quieren json_encode para codificar en lugar de su clase.

Usando su ejemplo:

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!"} 

Nota: esto funciona en PHP> = 5.4 http://php.net/manual/en/class.jsonserializable.php

+0

Con esta solución, "vacío" y "nulo" no se codificarán cuando sus valores no sean matrices vacías o nulos. Creo que esto no es lo que quería el asker. –

Cuestiones relacionadas