2012-03-25 10 views

Antwort

65

Dies sollte es tun!

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

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

Hier ist ein Beispiel

$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 
//) 

Wenn Sie die Ausgabe als Array anstelle eines Objekts wollen, übergeben true zu json_decode

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

Mehr über json_encode()

Siehe auch : json_decode()

+2

ein Problem, das ich mit jetzt zu tun habe ist - mit json_decode(), ich ein stdClass Objekt zu erhalten, nicht mein ursprüngliches Objekt. Ich könnte serialize/unserialize verwenden, aber meine Objekte ändern ihre Struktur im Laufe der Zeit, wenn auch nur geringfügig, wodurch die Serialisierung unbrauchbar wird. – Dennis

+1

@Dennis 'unserialize' gibt immer eine Instanz von' stdClass' zurück, dies macht es nicht unbrauchbar. Sie könnten Ihr API leicht so gestalten, dass es so etwas wie '$ attrs = unserialize ($ json); $ person = new Person ($ attrs); 'Ihr' Person' Konstruktor kann dann die Attribute entsprechend zuweisen. –

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

für mehr erweiterbarkeit für große apps verwenden oop stil mit eingekapselten felder.

einfache Art und Weise: -

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

Echo json_encode (neu Obst()); // die Ausgänge:

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

Echt Gson auf 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/ - Serialisierung nur
+0

alles, was gerade umgekehrt zur Funktion jsonSerialize .. –

+0

mit json das Problem ist der umgekehrte Teil, weil jeson_decode nur ein stdClass-Objekt zurückgibt. Sie müssten in der Lage sein, ein Objekt Ihrer Klasse zu initialisieren, indem Sie ein Array von Feldwerten bereitstellen. Viel zu viel Aufwand. Verwenden Sie einfach nur serialisieren. – Hafenkranich

0

I ma eine Methode, um dies zu lösen. Mein Ansatz ist:

1 - Erstellen Sie eine abstrakte Klasse mit einer Methode zum Konvertieren von Objekten in Array (einschließlich private attr) mit Regex. 2 - Konvertieren Sie das zurückgegebene Array in Json.

Ich benutze diese abstrakte Klasse als Eltern aller meiner Domain-Klassen

Class Code:

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