2012-01-08 25 views
8

Czy istnieje sposób kontrolowania zachowania json_encode obiektów? Jak wykluczanie pustych tablic, pól pustych i tak dalej?Jak kontrolować zachowanie json_encode?

mam na myśli coś podobnego podczas korzystania serialize(), gdzie można wdrożyć magiczną __sleep() metody i określić, jakie właściwości powinny być w odcinkach:

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

Odpowiedz

0

można zrobić zmienne prywatne. Wtedy nie pojawią się w kodowaniu JSON.

Jeśli nie jest to opcja, możesz utworzyć prywatną tablicę i użyć magicznych metod __get ($ key) i __set ($ key, $ value), aby ustawić i uzyskać wartości w/z tej tablicy. W twoim przypadku klucze będą "puste" i "puste". Możesz wtedy uzyskać do nich dostęp publicznie, ale koder JSON ich nie znajdzie.

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

Tak, wiem o tym, ale dzięki za odpowiedź. Problem polega na tym, że gdy B rozszerza A, B nie może zmodyfikować '$ privateVars' i uczynić go' prywatnym'. – gremo

+1

Czy włączenie tej funkcji chroni? Dlaczego B ma uczynić prywatną prywatną wartość $ private, to już jest prywatne. – Jarvix

6

Najbardziej odpowiednim rozwiązaniem rozciąga INTERFEJS JsonSerializable;

za pomocą tego interfejsu wystarczy, aby powrócić z funkcją jsonSerialize() co chcesz json_encode do kodowania zamiast swojej klasie.

Korzystanie przykład:

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

Uwaga: to działa w PHP> = 5,4 http://php.net/manual/en/class.jsonserializable.php

+0

Dzięki temu rozwiązaniu "puste" i "puste" nie zostaną zakodowane, gdy ich wartości nie są pustymi tablicami lub wartościami zerowymi. Wierzę, że to nie jest to, czego żądał pytający. –