web-dev-qa-db-fra.com

Utilisation de json_encode sur des objets dans PHP (peu importe la portée)

J'essaie de sortir des listes d'objets en json et j'aimerais savoir s'il existe un moyen de rendre des objets utilisables en json_encode? Le code que j'ai ressemble à quelque chose comme

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

Pour le moment, je me contente de parcourir le tableau d'utilisateurs et de les exporter individuellement dans des tableaux pour json_encode afin de me transformer en json utilisable. J'ai déjà essayé de rendre les objets itérables, mais json_encode semble 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 me donne json_encode:

php > echo json_encode($a);
{}

J'ai fini 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 faut des tableaux pleins de ces objets ou simplement d'instances uniques et les transforme en json - je l'utilise au lieu de json_encode. Je suis sûr qu'il y a des endroits où je pourrais améliorer les choses, mais j'espérais que json_encode serait capable de détecter le moment idéal pour parcourir un objet en fonction de ses interfaces exposées.

68
A. Rager

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 ) );
9
Gabor de Mooij

Toutes les propriétés de votre objet sont privées. aka ... non disponible en dehors de la classe.

Solution pour PHP <5.4

Si vous souhaitez sérialiser vos propriétés d'objet privées et protégées, vous devez implémenter une fonction de codage JSON à l'intérieur votre classe qui utilise json_encode() sur une structure de données créée à 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

Utilisez la nouvelle interface JsonSerializable pour fournir votre propre représentation json à utiliser 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()
        ];
    }
    ...
}

Un article plus détaillé

134
jondavidjohn

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.

Ainsi, 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);
    }
}
36
ilanco

Le code suivant a fonctionné pour moi:

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

Je n'ai pas encore vu cela mentionné, mais les beans ont une méthode intégrée appelée getProperties().

Alors, 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);

Cela génère:

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

Maintenant, allez un peu plus loin. Si nous avons un tableau de haricots ...

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

... alors nous pourrions faire ce qui suit:

  • Parcourez le tableau avec une boucle foreach.

  • Remplacez chaque élément (un haricot) par un tableau des propriétés du haricot.

Donc ça...

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

print json_encode($series);

... sort 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"
    }
]

J'espère que cela t'aides!

2
chrisfargen

Voici mon chemin:

function xml2array($xml_data)
{
    $xml_to_array = [];

    if(isset($xml_data))
    {
        if(is_iterable($xml_data))
        {
            foreach($xml_data as $key => $value)
            {
                if(is_object($value))
                {
                    if(empty((array)$value))
                    {
                        $value = (string)$value;
                    }
                    else
                    {
                        $value = (array)$value;
                    }
                    $value = xml2array($value);
                }
                $xml_to_array[$key] = $value;
            }
        }
        else
        {
            $xml_to_array = $xml_data;
        }
    }

    return $xml_to_array;
}
0
Andrei

J'inclus habituellement une petite fonction dans mes objets qui me permet de dump en array ou json ou xml Quelque chose comme:

public function exportObj($method = 'a')
{
     if($method == 'j')
     {
         return json_encode(get_object_vars($this));
     }
     else
     {
         return get_object_vars($this);
     }
}

de toute façon, get_object_vars() vous sera probablement utile.

0
Phoenix
$products=R::findAll('products');
$string = rtrim(implode(',', $products), ',');
echo $string;
0
Asahajit