2012-03-27 11 views
25

Próbuję echo zawartość obiektu w formacie JSON. Nie mam doświadczenia z PHP i zastanawiałem się, czy istnieje do tego predefiniowana funkcja (np. Json_encode()) czy sam musisz zbudować ciąg? Podczas wyszukiwania "obiektu PHP do JSON" znajduję tylko śmieci.Instancja klasy PHP do 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); 
    } 
} 

Co chcę toJSON powrotu:

{name: "treść Imie $ var", kod: 1001, MSG: Błąd podczas robi żądanie}

+4

prob nie było wokół u czas pisania tego, ale jeśli teraz używasz> 5.4, możesz to zrobić twoja implementacja klasy [JsonSerializable] (http://www.php.net/manual/en/jsonserializable.jsonserialize.php) –

Odpowiedz

31

Właśnie tam jesteś. Spójrz na get_object_vars w połączeniu z json_encode, a otrzymasz wszystko, czego potrzebujesz. Wykonanie:

json_encode(get_object_vars($error)); 

powinien zwrócić dokładnie to, czego szukasz.

Uwagi wychowany get_object_vars szacunek dla widoczności, więc rozważyć robi coś jak następuje w swojej klasie:

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

A potem zmienia poprzednią sugestię:

json_encode($error->expose()); 

To powinno zająć problemów z widocznością.

+0

Próbowałem tego wcześniej, ale zwróciło {}. Zgadnij, że zrobiłem coś źle wcześniej, dzięki człowieku! – Reinard

+0

AFAIK get_object_vars bierze również pod uwagę zakres, w którym jest wywoływany, więc jeśli wywołasz go z metody wewnątrz obiektu, będziesz miał również dostęp do prywatnych vars –

+0

'json_encode (get_object_vars ($ error));' wyświetli publicznych członków , nie ma szeregowych. – 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

Musisz dokonać zmienną publiczną, aby mogły się pojawić na json_encode().

Również kod szukasz jest

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

Podoba mi się to, ponieważ nie znam sposobu dla get_object_vars do wykluczania właściwości, których nie chcesz serializować. –

8

Alternatywnym rozwiązaniem w PHP 5.4+ używa interfejs 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); 
    } 
} 

Następnie można konwertować obiekt błędzie JSON z json_encode

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

Sprawdź przykład here

More information about \JsonSerializable