2012-03-27 10 views
25

Estoy intentando repetir el contenido de un objeto en formato JSON. Estoy bastante inexperto con PHP y me preguntaba si hay una función predefinida para hacer esto (como json_encode()) o ¿tiene que construir la cadena usted mismo? Cuando busca en Google "objeto PHP a JSON", solo encuentro basura.instancia de clase de PHP a 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); 
    } 
} 

Lo que quiero toJSON para volver:

{nombre: "el contenido de $ var name", código: 1001, msg: error al solicitud haciendo}

+4

prob no estaba en el hora de escribir esto, pero si ahora está usando> 5.4 puede tener su clase implementa [JsonSerializable] (http://www.php.net/manual/en/jsonserializable.jsonserialize.php) –

Respuesta

31

Estás por allí. Eche un vistazo a get_object_vars en combinación con json_encode y tendrá todo lo que necesita. Haciendo:

json_encode(get_object_vars($error)); 

debe devolver exactamente lo que estás buscando.

Los comentarios educados get_object_vars respeto a la visibilidad, por lo que considera hacer algo como lo siguiente en su clase:

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

Y a continuación, cambiar la sugerencia anterior a:

json_encode($error->expose()); 

Eso debe cuidar de problemas de visibilidad.

+0

Intenté esto antes pero me devolvió {}. Supongo que hice algo mal antes, gracias hombre! – Reinard

+0

AFAIK get_object_vars también tiene en cuenta el ámbito al que se llama, por lo que si lo llama desde un método dentro del objeto, también tendrá acceso a los vars privados –

+0

'json_encode (get_object_vars ($ error));' mostrará los miembros públicos no hay soldados – grifos

4
public function toJSON(){ 
    $json = array(
     'name' => $this->getName(), 
     'code' => $this->getCode(), 
     'msg' => $this->getMsg(), 
    ); 

    return json_encode($json); 
} 

Demostración: http://codepad.org/mPNGD6Gv

7

Tendrá que hacer su variable pública, con el fin de que aparezcan en json_encode().

Además, el código que está buscando es

public function toJSON(){ 
    return json_encode($this); 
} 
+0

Me gusta, ya que no sé de qué manera get_object_vars excluya las propiedades que no desea serializar. –

8

Una solución alternativa en PHP 5.4+ está utilizando la interfaz deJsonSerializable.

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

A continuación, puede convertir el objeto de error a JSON con json_encode

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

Salida del ejemplo here

More information about \JsonSerializable

Cuestiones relacionadas