Экземпляр класса PHP в JSON - PullRequest
31 голосов
/ 27 марта 2012

Я пытаюсь повторить содержимое объекта в формате JSON. Я не очень разбираюсь в PHP и мне было интересно, есть ли предопределенная функция для этого (например, json_encode ()), или вам нужно создать строку самостоятельно? Когда я гуглю "PHP-объект в JSON", я просто нахожу мусор.

class Error {
    private $name;
    private $code;
    private $msg;
    public function __construct($ErrorName, $ErrorCode, $ErrorMSG){
        $this->name = $ErrorName;
        $this->code = $ErrorCode;
        $this->msg = $ErrorMSG;
    }
    public function getCode(){
        return $this->code;
    }
    public function getName(){
        return $this->name;
    }
    public function getMsg(){
        return $this->msg;
    }
    public function toJSON(){
        $json = "";

        return json_encode($json);
    }
}

То, что я хочу вернуть в JSON:

{имя: «содержимое переменной $ name var», код: 1001, сообщение об ошибке: ошибка при выполнение запроса}

Ответы [ 4 ]

38 голосов
/ 27 марта 2012

Ты просто там.Посмотрите на get_object_vars в сочетании с json_encode, и вы получите все, что вам нужно.Выполнение:

json_encode(get_object_vars($error));

должно возвращать именно то, что вы ищете.

Комментарии вызывали уважение get_object_vars к видимости, поэтому подумайте о том, чтобы сделать что-то подобное в вашем классе:

public function expose() {
    return get_object_vars($this);
}

А затем изменив предыдущее предложение на:

json_encode($error->expose());

Это должно решить проблемы с видимостью.

24 голосов
/ 18 июля 2016

Альтернативное решение в PHP 5.4 + использует интерфейс JsonSerializable .

class Error implements \JsonSerializable
{
    private $name;
    private $code;
    private $msg;

    public function __construct($errorName, $errorCode, $errorMSG)
    {
        $this->name = $ErrorName;
        $this->code = $ErrorCode;
        $this->msg = $ErrorMSG;
    }

    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}

Затем вы можете преобразовать объект ошибки в JSON с помощью json_encode

$error = new MyError("Page not found", 404, "Unfortunately, the page does not exist");
echo json_encode($error);

Посмотрите пример здесь

Дополнительная информация о \ JsonSerializable

9 голосов
/ 27 марта 2012

Вам нужно сделать вашу переменную общедоступной, чтобы они отображались на json_encode().

Кроме того, код, который вы ищете:

public function toJSON(){
    return json_encode($this);
}
5 голосов
/ 27 марта 2012
public function toJSON(){
    $json = array(
        'name' => $this->getName(),
        'code' => $this->getCode(),
        'msg' => $this->getMsg(),
    );

    return json_encode($json);
}

Демо: http://codepad.org/mPNGD6Gv

...