43 votes

Conversion d'une classe PHP en JSON

J'essaie d'afficher le contenu d'un objet dans un format JSON. Je n'ai pas beaucoup d'expérience avec PHP et je me demandais s'il existe une fonction prédéfinie pour faire cela (comme json_encode()) ou si vous devez construire la chaîne vous-même ? En cherchant sur Google "PHP object to JSON", je ne trouve que des déchets.

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

Ce que je veux que toJSON retourne :

{ name : "the content of $name var", code : 1001, msg : erreur pendant faisant la demande}

7 votes

N'existait pas au moment de l'écriture de ce document, mais si vous utilisez maintenant >5.4, vous pouvez faire en sorte que votre classe implémente JsonSerializable

47voto

clexmond Points 1419

Vous y êtes presque. Jetez un coup d'oeil à get_object_vars en combinaison avec json_encode et vous aurez tout ce dont vous avez besoin. Faire :

json_encode(get_object_vars($error));

devrait retourner exactement ce que vous recherchez.

Les commentaires ont évoqué le respect de get_object_vars pour la visibilité, alors envisagez de faire quelque chose comme ce qui suit dans votre classe :

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

Et ensuite changer la suggestion précédente en :

json_encode($error->expose());

Cela devrait régler les problèmes de visibilité.

40voto

Mandy Schoep Points 844

Une solution alternative en PHP 5.4+. utilise le JsonSerializable interface.

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

Ensuite, vous pouvez convertir votre objet d'erreur en JSON con json_encode

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

Consultez l'exemple aquí

Plus d'informations sur \JsonSerializable

10voto

Second Rikudo Points 59550

Vous devrez rendre vos variables publiques, afin qu'elles apparaissent sur le site de la Commission européenne. json_encode() .

Aussi, le code que vous recherchez est

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

0 votes

J'aime bien cela car je ne connais pas de moyen pour get_object_vars d'exclure les propriétés que l'on ne veut pas sérialiser.

5voto

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

    return json_encode($json);
}

Démonstration : http://codepad.org/mPNGD6Gv

0voto

Cryptopat Points 119

Sous Linux, la commande suivante écrira la valeur d'une entrée de classe donnée dans un fichier ~/.config/scriptname/scriptname.conf crée le fichier s'il n'existe pas, et sinon lit et renvoie la valeur de la classe au chargement :

/* Example class */
class flag {
  static $COLORSET = ["\033[34;1m","\033[31;1m"];
}
/* Retrieve and set back values, otherwise create config file with the defined value --------------------------------------------------*/
if (!is_file($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]."/".$_SERVER["SCRIPT_NAME"].".conf")){
    @mkdir($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]);
    @file_put_contents($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]."/".$_SERVER["SCRIPT_NAME"].".conf",json_encode(["COLORSET"=>flag::$COLORSET]));
} else {
    flag::$COLORSET = json_decode(file_get_contents($_SERVER["HOME"]."/.config/".$_SERVER["SCRIPT_NAME"]."/".$_SERVER["SCRIPT_NAME"].".conf"), true)["COLORSET"];       
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X