objeto - php json_encode to js
Usando json_encode en objetos en PHP(independientemente del alcance) (8)
El siguiente código funcionó para mí:
public function jsonSerialize()
{
return get_object_vars($this);
}
Estoy tratando de sacar listas de objetos como json y me gustaría saber si hay una forma de hacer que los objetos se puedan usar en json_encode
? El código que tengo parece algo así como
$related = $user->getRelatedUsers();
echo json_encode($related);
En este momento, solo estoy iterando a través de la matriz de usuarios y exportándolos individualmente en matrices para que json_encode
convierta en json utilizable para mí. Ya he intentado hacer los objetos iterables, pero json_encode
parece omitirlos de todos modos.
editar : aquí está el 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*
}
}
}
y esto es lo que json_encode me da:
php > echo json_encode($a);
{}
Terminé con solo esto:
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).''}'';
}
}
Toma arrays llenos de esos objetos o solo instancias individuales y los convierte en json: los uso en lugar de json_encode. Estoy seguro de que hay lugares en los que podría hacerlo mejor, pero esperaba que json_encode pudiera detectar cuándo iterar a través de un objeto en función de sus interfaces expuestas.
En PHP> = 5.4.0 hay una nueva interfaz para serializar objetos a JSON: JsonSerializable
Simplemente implemente la interfaz en su objeto y defina un método JsonSerializable
que se llamará cuando use json_encode
.
Entonces, la solución para PHP> = 5.4.0 debería ser algo como esto:
class JsonObject implements JsonSerializable
{
// properties
// function called when encoded with json_encode
public function jsonSerialize()
{
return get_object_vars($this);
}
}
En RedBeanPHP 2.0 hay una función de exportación masiva que convierte una colección completa de beans en matrices. Esto funciona con el codificador JSON ..
json_encode( R::exportAll( $beans ) );
No vi esto mencionado todavía, pero los beans tienen un método incorporado llamado getProperties()
.
Entonces, para usarlo:
// 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);
Esto produce:
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
}
Ahora da un paso más. Si tenemos una variedad de frijoles ...
// An array of beans (just an example)
$series = array($post,$post,$post);
... entonces podríamos hacer lo siguiente:
Pasa por la matriz con un ciclo
foreach
.Reemplace cada elemento (un frijol) con una matriz de propiedades del frijol.
Así que esto...
foreach ($series as &$val) {
$val = $val->getProperties();
}
print json_encode($series);
... muestra esto:
[
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
},
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
},
{
"id": "13",
"title": "Oliver Twist",
"author": "Charles Dickens"
}
]
¡Espero que esto ayude!
Normalmente incluyo una pequeña función en mis objetos que me permite volcar a array o json o xml. Algo como:
public function exportObj($method = ''a'')
{
if($method == ''j'')
{
return json_encode(get_object_vars($this));
}
else
{
return get_object_vars($this);
}
}
De cualquier manera, get_object_vars()
probablemente sea útil para usted.
Todas las propiedades de tu objeto son privadas. aka ... no disponible fuera del alcance de su clase.
Solución para PHP <5.4
Si desea serializar sus propiedades de objetos privados y protegidos, debe implementar una función de codificación JSON dentro de su Clase que utilice json_encode()
en una estructura de datos que cree para este fin.
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()
));
}
...
}
Solución para PHP> = 5.4
Utilice la nueva interfaz JsonSerializable
para proporcionar su propia representación json para ser utilizada por 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()
];
}
...
}
para una variedad de objetos, utilicé algo como esto, siguiendo el método personalizado para php <5.4:
$jsArray=array();
//transaction is an array of the class transaction
//which implements the method to_json
foreach($transactions as $tran)
{
$jsArray[]=$tran->to_json();
}
echo json_encode($jsArray);
$products=R::findAll(''products'');
$string = rtrim(implode('','', $products), '','');
echo $string;