0

我想取一个像

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。

4

3 回答 3

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

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

演示 PHP 5.4演示 PHP 5.2

于 2012-10-20T18:30:18.513 回答
1

您可以尝试使用json_encode($object), 和json_decode($jsonObject)。现在,唯一的问题是,我不确定 json_decode 是否会返回正确的对象,或者只是StdClass具有给定属性的对象。

我只是尝试json_decode()在一个简单的 json 对象上做一个,它将它变成对象的一个stdClass​​对象,所以你不会Vo从 json 中取回你的对象。正如所dfsq指出的,json 不适用于私有属性。

如果你这样做serialize($object)unserialize($string)那么你可以取回类型,但这是特定于 PHP 的,不像 json 那样可移植。

也看看这个(php 5.4+): http ://www.php.net/manual/en/class.jsonserializable.php

于 2012-10-20T18:23:43.007 回答
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);
}
于 2012-10-20T20:40:35.467 回答