有一个内置的方法来获取值对象或数据传输对象并使用PHP将其转换为json?

时间:2012-10-20 18:21:03

标签: php json

我想要一个像

这样的价值对象
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。

3 个答案:

答案 0 :(得分:4)

您不能使用json_encode(),因为它不适用于私有变量。您需要在对象上定义另一个函数:

function getJSON() {
    return  '[{"blah" : "'.$this->blah.'", "de" : "'.$this->de.'"}]';
}

codepad

编辑:因为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());

所以你有一个如何处理它的共同模式。

Demo PHP 5.4; Demo PHP 5.2

答案 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);
}