我想要一个像
这样的价值对象class Vo {
private $blah;
private $de;
public function setBlah($blah) {
$this->blah = $blah;
}
public function getBlah() {
return $this->blah;
}
public function setDe($de) {
$this->de = $de;
}
public function getDe() {
return $this->de;
}
}
在构建它之前,调用一个方法,将其转换为数组,甚至更好地构建JSON,使其看起来像[{"blah" : "something set", "de" : "something set"}]
。我只是从Java / Jboss返回PHP,我可以在对象上调用一个方法,然后将其转换为json。
答案 0 :(得分:4)
您不能使用json_encode()
,因为它不适用于私有变量。您需要在对象上定义另一个函数:
function getJSON() {
return '[{"blah" : "'.$this->blah.'", "de" : "'.$this->de.'"}]';
}
编辑:因为PHP 5.4 PHP很容易提供:
class Vo implements JsonSerializable {
...
public function jsonSerialize() {
return get_object_vars($this);
}
...
}
...
var_dump(json_encode($object));
给你:
string(29) "{"blah":"hammer","de":"time"}"
见The JsonSerializable interface
。即使你低于PHP 5.4实现该功能,然后只需手动调用它:
json_encode($object->jsonSerialize());
所以你有一个如何处理它的共同模式。
答案 1 :(得分:1)
您可以尝试使用json_encode($object)
和json_decode($jsonObject)
。
现在,唯一的问题是,我不确定json_decode是返回正确的对象,还是只返回具有给定属性的StdClass
。
我只是尝试在一个简单的json对象上做一个json_decode()
,然后把它变成stdClass
对象的一个对象,所以你不会得到你的Vo
个对象来自json。
正如dfsq
指出的那样,json不适用于私有属性。
如果您执行serialize($object)
,unserialize($string)
,那么您可以返回类型,但这是特定于PHP的,而不是像json那样可移植。
另外看看这个(php 5.4+): http://www.php.net/manual/en/class.jsonserializable.php
答案 2 :(得分:0)
如果您是从头开始编写自己的代码,@ Somekittens建议使用@hakre编辑回答,但有时您不希望/无法修改类代码。您可以轻松json_encode
具有所有属性的任何对象,但您需要将其强制转换为数组并清除私有/受保护属性名称的键:
/**
* Encode object to JSON with protected/private variables with nested objects support.
* @param mixed $object object to be jsonized
* @param int $jsonEncodeOptions see JSON_* constants
* @param bool $returnArray for recursive calls
* @return string|array JSON string, associative array for recursive calls
*/
function json_encode_object($object, $jsonEncodeOptions = 0, $returnArray = FALSE){
$ret = array();
foreach((array)$object as $key => $value){
if(is_resource($value)){
//$rVal = NULL;
continue;
}elseif(is_object($value)){
$rVal = json_encode_object($value, $jsonEncodeOptions, TRUE);
}else{
$rVal = $value;
}
$rKey = str_replace(
array(
chr(0)."*".chr(0), //protected
chr(0).get_class($object).chr(0) //private
)
,'',
$key
);
$ret[$rKey] = $rVal;
}
return $returnArray?$ret:json_encode($ret, $jsonEncodeOptions);
}