jesseschalken / pure-json
json_encode/json_decode wrapper with error checking and one-to-one mapping between PHP and JSON values
Installs: 40 516
Dependents: 2
Suggesters: 0
Security: 0
Stars: 1
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/jesseschalken/pure-json
Requires (Dev)
This package is not auto-updated.
Last update: 2025-10-12 00:35:32 UTC
README
json_encode()/json_decode() wrapper for PHP 5.3+ with one-to-one mapping between JSON and PHP values.
use PureJSON\JSON; $json = JSON::encode($value); $value = JSON::decode($json);
-
JSON::encode()will only accept values which can be converted into their exact original byJSON::decode(), so thatJSON::decode(JSON::encode($x)) === $x. The accepted values are:intstringfloat(but notINF,-INForNAN)boolnullarray(whose contents are also valid)
-
JSON::encode()/JSON::decode()will assume PHP strings are UTF-8 by default. To encode/decode binary or ISO-8859-1 strings, useJSON::encode(..., true)andJSON::decode(..., true). -
To pretty print JSON, use
JSON::encode(..., ..., true). -
JSON::encode()/JSON::decode()will checkjson_last_error()for you and throw aPureJSON\JSONExceptionwith an appropriate code and message.
Serialization
The methods JSON::serialize() and JSON::deserialize() differ from JSON::encode() and JSON::decode() by mapping the JSON {...} syntax to and from PHP objects instead of to and from PHP associative arrays. Whereas JSON::encode() rejects objects and accepts associative arrays, JSON::serialize() rejects associative arrays and accepts objects.
In order for JSON::deserialize() to reproduce an instance of the original class given to JSON::serialize():
- Objects provided to
JSON::serialize()must implement thePureJSON\Serializableinterface. - The method
jsonProps()is used for properties andjsonType()is used to fill a special@typeproperty to identify the type of the object. JSON::deserialize()requires an explicit list of classes implementingPureJSON\Serializableto possibly instantiate using the methodjsonCreate($props).
(By storing a type tag instead of the PHP class name in JSON, the PHP class can be renamed while maintaining compatibility with existing serialized data, and if the JSON given to JSON::deserialize() is produced by an attacker, they cannot instantiate classes outside of the explicit list.)
Exmaple
With JSON::encode()/JSON::decode():
use PureJson\JSON; $company = array( 'name' => 'Good Company', 'employees' => array( array( 'name' => 'Jesse', 'role' => 'sales', ), array( 'name' => 'Ben', 'role' => 'development', ), ), ); // encode/decode will reproduce the original array $json = JSON::encode($company); $company = JSON::decode($json);
{
"name": "Good Company",
"employees": [
{
"name": "Jesse",
"role": "sales"
},
{
"name": "Ben",
"role": "Development"
}
]
}
With JSON::serialize()/JSON::deserialize():
use PureJson\JSON; use PureJson\Serializable; class Company implements Serializable { public static function jsonCreate(array $props) { return new self($props['name'], $props['employees']); } public static function jsonType() { return 'company'; } private $name; private $employees; public function __construct($name, $employees) { $this->name = $name; $this->employees = $employees; } public function jsonProps() { return array( 'name' => $this->name, 'employees' => $this->employees, ); } } class Employee implements Serializable { public static function jsonCreate(array $props) { return new self($props['name'], $props['role']); } public static function jsonType() { return 'employee'; } private $name; private $role; public function __construct($name, $role) { $this->name = $name; $this->role = $role; } public function jsonProps() { return array( 'name' => $this->name, 'role' => $this->role, ); } } $company = new Company( 'Good Company', array( new Employee('Jesse', 'sales'), new Employee('Ben', 'development'), ) ); // serialize/deserialize will produce the original object graph $json = JSON::serialize($company); $company = JSON::deserialize($json, array( Company::class, Employee::class, ));
{
"@type": "company",
"name": "Good Company",
"employees": [
{
"@type": "employee",
"name": "Jesse",
"role": "sales"
},
{
"@type": "employee",
"name": "Ben",
"role": "Development"
}
]
}