2012-03-27 4 views
25

Sto cercando eco il contenuto di un oggetto in un formato JSON. Sono abbastanza inesperti con PHP e mi chiedevo se esiste una funzione predefinita per fare questo (come json_encode()) o avete costruire la stringa di te stesso? Quando Googling "oggetto PHP per JSON", mi sto solo trovare spazzatura.PHP istanza di classe 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); 
    } 
} 

Quello che voglio toJSON per tornare:

{name: "il contenuto di $ var name", il codice: 1001, msg: errore durante facendo richiesta}

+4

prob non era intorno al tempo di scrivere questo, ma se ora stai usando> 5.4 puoi averlo la classe implementare [JsonSerializable] (http://www.php.net/manual/en/jsonserializable.jsonserialize.php) –

risposta

31

Sei quasi lì. Date un'occhiata a get_object_vars in combinazione con json_encode e avrete tutto il necessario.

json_encode(get_object_vars($error)); 

dovrebbe restituire esattamente quello che stai cercando.

I commenti educati get_object_vars rispetto per la visibilità, in modo da considerare facendo qualcosa di simile a quanto segue nella classe:

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

E quindi modificando il suggerimento precedente:

json_encode($error->expose()); 

che dovrebbe prendersi cura di problemi di visibilità.

+0

Ho provato questo prima, ma restituito {}. Indovina che ho fatto qualcosa di sbagliato prima, grazie amico! – Reinard

+0

get_object_vars AFAIK prende in considerazione anche l'ambito in cui si chiama, quindi se lo si chiama da un metodo all'interno dell'oggetto, si avrà anche accesso alle Vars privati ​​ –

+0

'json_encode (get_object_vars ($ error));' visualizzerà membri pubblici , nessun privato. – grifos

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

    return json_encode($json); 
} 

Demo: http://codepad.org/mPNGD6Gv

7

Avrai bisogno di rendere il vostro pubblico variabile, in modo per loro di apparire sul json_encode().

Inoltre, il codice che stai cercando è

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

Mi piace perché non conosco un modo per get_object_vars per escludere le proprietà che non si desidera serializzare. –

8

Una soluzione alternativa in PHP 5.4+ sta usando l'interfaccia 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); 
    } 
} 

Quindi, è possibile convertire l'oggetto di errore per JSON con json_encode

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

Partenza l'esempio here

More information about \JsonSerializable