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.
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 ) );
Toutes les propriétés de votre objet sont privées. aka ... non disponible en dehors de la classe.
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()
));
}
...
}
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()
];
}
...
}
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);
}
}
Le code suivant a fonctionné pour moi:
public function jsonSerialize()
{
return get_object_vars($this);
}
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!
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;
}
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.
$products=R::findAll('products');
$string = rtrim(implode(',', $products), ',');
echo $string;