2012-01-08 32 views
8

Có cách nào để kiểm soát hành vi json_encode trên các đối tượng không? Giống như loại trừ các mảng trống, các trường rỗng và cứ như vậy?Làm cách nào để kiểm soát hành vi json_encode?

Ý tôi là một cái gì đó giống như khi sử dụng serialize(), nơi bạn có thể thực hiện phép thuật __sleep() phương pháp và chỉ định những gì thuộc tính nên được tuần tự:

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

Trả lời

0

Bạn có thể làm cho các biến tư nhân. Sau đó, chúng sẽ không hiển thị trong mã hóa JSON.

Nếu đó không phải là một tùy chọn, bạn có thể tạo một mảng riêng và sử dụng phương pháp ma thuật __get ($ key) và __set ($ key, $ value) để đặt và nhận giá trị trong/từ mảng này. Trong trường hợp của bạn, các phím sẽ là 'trống' và 'không'. Sau đó, bạn vẫn có thể truy cập chúng một cách công khai nhưng bộ mã hóa JSON sẽ không tìm thấy chúng.

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

Vâng, tôi biết rằng nhưng nhờ cho câu trả lời. Vấn đề là khi B mở rộng A, B không thể sửa đổi '$ privateVars' và làm cho nó 'riêng tư'. – gremo

+1

Làm cho công việc được bảo vệ? Tại sao B làm cho privateVars tư nhân, nó đã được tư nhân. – Jarvix

6

Các giải pháp đúng nhất là mở rộng giao diện JsonSerializable;

bằng cách sử dụng giao diện này, bạn chỉ cần phải trả lại với chức năng jsonSerialize() những gì bạn muốn json_encode để mã hóa thay vì lớp học của bạn.

Sử dụng ví dụ của bạn:

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

Lưu ý: công trình này trong php> = 5.4 http://php.net/manual/en/class.jsonserializable.php

+0

Với giải pháp này, "trống" và "null" sẽ không được mã hóa khi giá trị của chúng không phải là mảng trống hoặc giá trị rỗng. Tôi tin rằng đây không phải là điều người hỏi muốn. –

Các vấn đề liên quan