78 votes

Utilisation de json_encode sur des objets en PHP (quelle que soit leur portée)

J'essaie de sortie des listes d'objets json et voudrais savoir si il existe un moyen de rendre les objets utilisables json_encode? Le code que j'ai ressemble à quelque chose comme

$related = $user->getRelatedUsers();
echo json_encode($related);

Maintenant, je suis juste une itération à travers l'ensemble des utilisateurs individuellement et de les exporter dans des tableaux pour json_encode pour les transformer en utilisable json pour moi. J'ai déjà essayé d'en faire les objets d'itérable, mais json_encode semble juste de les ignorer, de toute façon.

edit: voici le var_dump();

php > var_dump($a);
object(RedBean_OODBBean)#14 (2) {
  ["properties":"RedBean_OODBBean":private]=>
  array(11) {
    ["id"]=>
    string(5) "17972"
    ["pk_UniversalID"]=>
    string(5) "18830"
    ["UniversalIdentity"]=>
    string(1) "1"
    ["UniversalUserName"]=>
    string(9) "showforce"
    ["UniversalPassword"]=>
    string(32) ""
    ["UniversalDomain"]=>
    string(1) "0"
    ["UniversalCrunchBase"]=>
    string(1) "0"
    ["isApproved"]=>
    string(1) "0"
    ["accountHash"]=>
    string(32) ""
    ["CurrentEvent"]=>
    string(4) "1204"
    ["userType"]=>
    string(7) "company"
  }
  ["__info":"RedBean_OODBBean":private]=>
  array(4) {
    ["type"]=>
    string(4) "user"
    ["sys"]=>
    array(1) {
      ["idfield"]=>
      string(2) "id"
    }
    ["tainted"]=>
    bool(false)
    ["model"]=>
    object(Model_User)#16 (1) {
      ["bean":protected]=>
      *RECURSION*
    }
  }
}

et voici ce que json_encode me donne:

php > echo json_encode($a);
{}

J'ai fini vers le haut avec juste ceci:

    function json_encode_objs($item){   
        if(!is_array($item) && !is_object($item)){   
            return json_encode($item);   
        }else{   
            $pieces = array();   
            foreach($item as $k=>$v){   
                $pieces[] = "\"$k\":".json_encode_objs($v);   
            }   
            return '{'.implode(',',$pieces).'}';   
        }   
    }   

Il prend des tableaux plein de ces objets ou de simples instances et les transforme en json - je utiliser à la place de json_encode. Je suis sûr qu'il y a des endroits que je pouvais faire mieux, mais j'espérais que json_encode serait capable de détecter quand l'itération à travers un objet en fonction de ses interfaces exposées.

160voto

jondavidjohn Points 28769

Toutes les propriétés de votre objet privé. aka... pas disponibles en dehors de leur classe de portée.

Solution PHP < 5.4

Si vous ne voulez sérialiser vos protégées et les propriétés de l'objet, vous devez implémenter un encodage JSON fonction à l'intérieur de votre Classe qui utilise json_encode() sur une structure de données que vous créez à cet effet.

class Thing {
    ...
    public function to_json() {
        return json_encode(array(
            'something' => $this->something,
            'protected_something' => $this->get_protected_something(),
            'private_something' => $this->get_private_something()                
        ));
    }
    ...
}

Solution pour PHP >= 5.4

Utiliser le nouveau JsonSerializable Interface pour fournir votre propre représentation json d'être utilisée par json_encode

class Thing implements JsonSerializable {
    ...
    public function jsonSerialize() {
        return [
            'something' => $this->something,
            'protected_something' => $this->get_protected_something(),
            'private_something' => $this->get_private_something()
        ];
    }
    ...
}

Plus description détaillée

46voto

ilanco Points 3980

Dans PHP> = 5.4.0, une nouvelle interface permet de sérialiser des objets en JSON: JsonSerializable

Implémentez simplement l'interface dans votre objet et définissez une méthode JsonSerializable qui sera appelée lorsque vous utiliserez json_encode .

Donc, la solution pour PHP> = 5.4.0 devrait ressembler à ceci:

 class JsonObject implements JsonSerializable
{
    // properties

    // function called when encoded with json_encode
    public function jsonSerialize()
    {
        return get_object_vars($this);
    }
}
 

8voto

Gabor de Mooij Points 1963

Dans RedBeanPHP 2.0, il existe une fonction d'exportation en masse qui transforme toute une collection de haricots en tableaux. Cela fonctionne avec l'encodeur JSON.

 json_encode( R::exportAll( $beans ) );
 

4voto

user2944142 Points 1

Le code suivant a fonctionné pour moi:

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

2voto

chrisfargen Points 501

Je ne vois pas encore mentionné, mais les haricots ont une méthode intégrée appelés getProperties().

Donc, pour l'utiliser:

// What bean do we want to get?
$type = 'book';
$id = 13;

// Load the bean
$post = R::load($type,$id);

// Get the properties
$props = $post->getProperties();

// Print the JSON-encoded value
print json_encode($props);

Ce sorties:

{
    "id": "13",
    "title": "Oliver Twist",
    "author": "Charles Dickens"
}

Maintenant franchir une nouvelle étape. Si nous avons un tableau de haricots...

// An array of beans (just an example)
$series = array($post,$post,$post);

...puis nous avons pu effectuer les opérations suivantes:

  • Parcourir le tableau avec un foreach boucle.

  • Remplacer chaque élément (un haricot) avec un tableau de la fève de ses propriétés.

Donc, ce...

foreach ($series as &$val) {
  $val = $val->getProperties();
}

print json_encode($series);

...sorties ceci:

[
    {
        "id": "13",
        "title": "Oliver Twist",
        "author": "Charles Dickens"
    },
    {
        "id": "13",
        "title": "Oliver Twist",
        "author": "Charles Dickens"
    },
    {
        "id": "13",
        "title": "Oliver Twist",
        "author": "Charles Dickens"
    }
]

Espérons que cette aide!

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