65 votes

Conversion d'objet en JSON et de JSON en objet en PHP (bibliothèque comme Gson pour Java)

Je développe une application web en PHP,

J'ai besoin de transférer de nombreux objets du serveur en tant que chaîne JSON, existe-t-il une bibliothèque existante pour que PHP convertisse l'objet en JSON et la chaîne JSON en objet, comme la bibliothèque Gson pour Java.

118voto

maček Points 25640

Cela devrait faire l'affaire!

 // convert object => json
$json = json_encode($myObject);

// convert json => object
$obj = json_decode($json);

Voici un exemple

 $foo = new StdClass();
$foo->hello = "world";
$foo->bar = "baz";

$json = json_encode($foo);
echo $json;
//=> {"hello":"world","bar":"baz"}

print_r(json_decode($json));
// stdClass Object
// (
//   [hello] => world
//   [bar] => baz
// )

Si vous voulez la sortie sous forme de tableau au lieu d'un objet, passez true à json_decode

 print_r(json_decode($json, true));
// Array
// (
//   [hello] => world
//   [bar] => baz
// )    

En savoir plus sur json_encode()

Voir aussi : json_decode()

5voto

Kishor Kundan Points 1785
json_decode($json, true); 
// the second param being true will return associative array. This one is easy.

2voto

BenjeminStar Points 29

Code PHP8 :

 class foo{
    function __construct(
        public $bar,
        protected $bat,
        private $baz,
    ){}

    function getBar(){return $this->bar;}
    function getBat(){return $this->bat;}
    function getBaz(){return $this->baz;}
}

//Create Object
$foo = new foo(bar:"bar", bat:"bat", baz:"baz");

//Object => JSON
$fooJSON = json_encode(serialize($foo));
print_r($fooJSON);
// "O:3:\"foo\":3:{s:3:\"bar\";s:3:\"bar\";s:6:\"\u0000*\u0000bat\";s:3:\"bat\";s:8:\"\u0000foo\u0000baz\";s:3:\"baz\";}"

// Important. In order to be able to unserialize() an object, the class of that object needs to be defined.
#   More information here: https://www.php.net/manual/en/language.oop5.serialization.php
//JSON => Object
$fooObject = unserialize(json_decode($fooJSON));
print_r($fooObject);
//(
#    [bar] => bar
#    [bat:protected] => bat
#    [baz:foo:private] => baz
# )

//To use some functions or Properties of $fooObject
echo $fooObject->bar;
// bar

echo $fooObject->getBat();
// bat

echo $fooObject->getBaz();
// baz

0voto

ivanknow Points 11

J'ai fait une méthode pour résoudre ce problème. Ma démarche est :

1 - Créez une classe abstraite dotée d'une méthode pour convertir des objets en tableau (y compris un attr privé) à l'aide de Regex. 2 - Convertissez le tableau renvoyé en json.

J'utilise cette classe abstraite comme parent de toutes mes classes de domaine

Code de la classe:

 namespace Project\core;

abstract class AbstractEntity {
    public function getAvoidedFields() {
        return array ();
    }
    public function toArray() {
        $temp = ( array ) $this;

        $array = array ();

        foreach ( $temp as $k => $v ) {
            $k = preg_match ( '/^\x00(?:.*?)\x00(.+)/', $k, $matches ) ? $matches [1] : $k;
            if (in_array ( $k, $this->getAvoidedFields () )) {
                $array [$k] = "";
            } else {

                // if it is an object recursive call
                if (is_object ( $v ) && $v instanceof AbstractEntity) {
                    $array [$k] = $v->toArray();
                }
                // if its an array pass por each item
                if (is_array ( $v )) {

                    foreach ( $v as $key => $value ) {
                        if (is_object ( $value ) && $value instanceof AbstractEntity) {
                            $arrayReturn [$key] = $value->toArray();
                        } else {
                            $arrayReturn [$key] = $value;
                        }
                    }
                    $array [$k] = $arrayReturn;
                }
                // if it is not a array and a object return it
                if (! is_object ( $v ) && !is_array ( $v )) {
                    $array [$k] = $v;
                }
            }
        }

        return $array;
    }
}

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