Converting Object to JSON and JSON to Object in PHP, (library like Gson for Java)

PhpGsonJson

Php Problem Overview


I am developing a web application in PHP,

I need to transfer many objects from server as JSON string, is there any library existing for PHP to convert object to JSON and JSON String to Objec, like Gson library for Java.

Php Solutions


Solution 1 - Php

This should do the trick!

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

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

Here's an example

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

If you want the output as an Array instead of an Object, pass true to json_decode

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

More about json_encode()

See also: json_decode()

Solution 2 - Php

for more extendability for large scale apps use oop style with encapsulated fields.

Simple way :-

  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(new Fruit()); //which outputs:

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

Real Gson on 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/ - serialize only

Solution 3 - Php

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

Solution 4 - Php

PHP8-Code:

class foo{
    function __construct(
        public $bar,
        protected $bat,
        private $baz,
    ){}

    function getBar(){return $this->bar;}
    function getBat(){return $this->bat;}
    function getBaz(){return $this->baz;}
}

//Create Object
$foo = new foo(bar:"bar", bat:"bat", baz:"baz");

//Object => JSON
$fooJSON = json_encode(serialize($foo));
print_r($fooJSON);
// "O:3:\"foo\":3:{s:3:\"bar\";s:3:\"bar\";s:6:\"\u0000*\u0000bat\";s:3:\"bat\";s:8:\"\u0000foo\u0000baz\";s:3:\"baz\";}"

// Important. In order to be able to unserialize() an object, the class of that object needs to be defined.
#   More information here: https://www.php.net/manual/en/language.oop5.serialization.php
//JSON => Object
$fooObject = unserialize(json_decode($fooJSON));
print_r($fooObject);
//(
#    [bar] => bar
#    [bat:protected] => bat
#    [baz:foo:private] => baz
# )

//To use some functions or Properties of $fooObject
echo $fooObject->bar;
// bar

echo $fooObject->getBat();
// bat

echo $fooObject->getBaz();
// baz

Solution 5 - Php

I made a method to solve this. My approach is:

1 - Create a abstract class that have a method to convert Objects to Array (including private attr) using Regex. 2 - Convert the returned array to json.

I use this Abstract class as parent of all my domain classes

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionfarhan aliView Question on Stackoverflow
Solution 1 - PhpmačekView Answer on Stackoverflow
Solution 2 - PhpOshan WisumperumaView Answer on Stackoverflow
Solution 3 - PhpKishor KundanView Answer on Stackoverflow
Solution 4 - PhpBenjeminStarView Answer on Stackoverflow
Solution 5 - PhpivanknowView Answer on Stackoverflow