2012-03-25 24 views

Respuesta

65

Esto debe hacer el truco!

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

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

He aquí un ejemplo

$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 desea que la salida como una matriz en lugar de un objeto, pasar true a json_decode

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

Más sobre json_encode()

Véase también : json_decode()

+2

un problema que estoy tratando ahora - con ayuda de json_decode(), me sale un objeto stdClass, no es mi objeto original Podría usar serialize/unserialize, pero mis objetos cambian de estructura a lo largo del tiempo, aunque sea levemente, haciendo que la serialización no se pueda utilizar. – Dennis

+1

@Dennis 'unserialize' siempre devolverá una instancia de' stdClass', esto no lo hace inutilizable. Podría diseñar fácilmente su API para soportar algo como '$ attrs = unserialize ($ json); $ person = new Person ($ attrs); 'Tu constructor' Person' puede asignar los atributos en consecuencia. –

3
json_decode($json, true); 
// the second param being true will return associative array. This one is easy. 
12

para una mayor extensibilidad para aplicaciones a gran escala, utilice el estilo OOP con campos encapsulados.

manera simple: -

class Fruit implements JsonSerializable { 

     private $type = 'Apple', $lastEaten = null; 

     public function __construct() { 
      $this->lastEaten = new DateTime(); 
     } 

     public function jsonSerialize() { 
      return [ 
       'category' => $this->type, 
       'EatenTime' => $this->lastEaten->format(DateTime::ISO8601) 
      ]; 
     } 
    } 

eco json_encode (nueva fruta()); // que emite:

{"category":"Apple","EatenTime":"2013-01-31T11:17:07-0500"} 

real Gson en PHP: -

  1. http://jmsyst.com/libs/serializer
  2. http://symfony.com/doc/current/components/serializer.html
  3. http://framework.zend.com/manual/current/en/modules/zend.serializer.html
  4. http://fractal.thephpleague.com/ - serializar única
+0

todo lo que hace exactamente al revés de la función jsonSerialize .. –

+0

con el uso de json el problema es la parte inversa porque jeson_decode solo devuelve un objeto stdClass. Debería poder inicializar un objeto de su clase al proporcionar una matriz de valores de campo. Demasiado sobrecarga. solo use serialize simple. – Hafenkranich

0

I ma de un método para resolver esto. Mi enfoque es:

1 - Cree una clase abstracta que tenga un método para convertir Objetos a Matriz (incluido el atributo privado) utilizando Regex. 2 - Convierta la matriz devuelta en json.

que utilizan esta clase abstracta como padre de todas mis clases de dominio de código

Clase:

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; 
    } 
}