有没有办法控制对象的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 :(得分:5)
最正确的解决方案是扩展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
答案 1 :(得分: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