zumba/json-serializer
Serialize and unserialize PHP values to JSON (like serialize()), including scalars, arrays, objects, recursion, stdClass extra properties, nested data, and binary. Optional closure support via third party. PHP 7.2+; avoid untrusted input.
## Getting Started
### **First Steps**
1. **Installation**
```bash
composer require zumba/json-serializer:^3.2.4
The package is auto-discoverable in Laravel 5.5+ (no manual provider registration needed).
Basic Usage
use Zumba\JsonSerializer\JsonSerializer;
$serializer = app(JsonSerializer::class);
$data = ['name' => 'John', 'age' => 30, 'active' => true];
// Serialize
$json = $serializer->serialize($data);
// '{"name":"John","age":30,"active":true}'
// Unserialize
$decoded = $serializer->unserialize($json);
// ['name' => 'John', 'age' => 30, 'active' => true]
First Use Case
json_encode() with $serializer->serialize() for consistent JSON formatting.public string $name without initialization). Now defaults to null for uninitialized typed properties.SECURITY.md for best practices on input validation and output sanitization.Object Serialization (Including Parent/Child Class Properties)
class ParentClass {
private $secret = 'hidden';
}
class ChildClass extends ParentClass {
public $name = 'Alice';
private $privateData = 'child_secret';
}
$child = new ChildClass();
$json = $serializer->serialize($child);
// Now includes ALL private properties from parent AND child classes
Handling Typed Properties (Fixed in v3.2.4)
class User {
public string $name; // No longer throws fatal error if uninitialized
public int $age;
public ?DateTime $createdAt; // Nullable types work too
}
$user = new User(); // No errors
$json = $serializer->serialize($user);
// '{"name":null,"age":null,"createdAt":null}'
Custom Handlers for Special Types
// Handle DateTime objects
$serializer->setDateTimeHandler(function ($date) {
return $date->format('Y-m-d H:i:s');
});
// Handle Carbon instances
$serializer->setObjectHandler('Carbon\Carbon', function ($carbon) {
return $carbon->toIso8601String();
});
// Handle circular references (safer with default handler)
$serializer->setCircularReferenceHandler(function ($object, $path) {
return "[Circular Reference: {$path}]";
});
Integration with Laravel
public function toArray($request)
{
return $this->serializer->serialize($this->resource, [
'exclude' => ['password', 'api_token'],
]);
}
public function handle($request, Closure $next)
{
$request->merge($this->serializer->unserialize($request->input('data')));
return $next($request);
}
protected $casts = [
'created_at' => 'datetime:Y-m-d H:i:s',
];
// Serialize with custom format
$json = $serializer->serialize($this)->setDateTimeHandler('Y-m-d H:i:s');
Batch Processing with Typed Safety
$users = User::all();
$jsonArray = array_map(
fn ($user) => $serializer->serialize($user),
$users
);
// No fatal errors for uninitialized typed properties
Closure Compatibility (v3.2.4)
// Works seamlessly with opis/closure v4
$serializer->setObjectHandler('Closure', function ($closure) {
return 'Closure detected';
});
Circular References
[Circular Reference: path]) instead of throwing an error.setCircularReferenceHandler if needed.Private/Protected Properties
exclude option:
$json = $serializer->serialize($object, ['exclude' => ['secret']]);
Uninitialized Typed Properties (Now Fixed)
null for uninitialized typed properties (e.g., public string $name).$serializer->setStrictTypedProperties(true); // Throws error if uninitialized
Performance with Large Data
$cached = cache()->remember("user_{$user->id}_serialized", now()->addHours(1), function () use ($user) {
return $serializer->serialize($user);
});
Security Considerations (New in v3.2.4)
SECURITY.md for input validation and output sanitization.unserialize cautiously):
$data = $serializer->unserialize($json, ['strict' => true]);
$serializer->setPrettyPrint(true);
$json = $serializer->serialize($data); // Indented JSON
if (json_validate($serializer->serialize($data))) {
// Safe to use
}
try {
$json = $serializer->serialize($user, ['strict' => true]);
} catch (\TypeError $e) {
// Handle or log typed property errors
}
$serializer->setCircularReferenceHandler(function ($object, $path) {
Log::debug("Circular reference detected at: {$path}");
return "[Circular]";
});
Custom Serializers
Zumba\JsonSerializer\Contracts\Serializer for domain-specific logic.class UserSerializer implements Serializer {
public function serialize($data) {
// Custom logic
}
}
Closure Support (v3.2.4)
$serializer->setObjectHandler('Closure', function ($closure) {
return 'Closure serialized';
});
Configuration
config/zumba-json-serializer.php:
'default_handlers' => [
'App\Models\User' => 'App\Serializers\UserSerializer',
],
'strict_typed_properties' => env('JSON_SERIALIZER_STRICT', false),
$v1Serializer = new JsonSerializer(['version' => '1.0', 'exclude' => ['deprecated_field']]);
$v2Serializer = new JsonSerializer(['version' => '2.0']);
Response:
return response()->json(
$serializer->serialize($data),
200,
['Content-Type' => 'application/json; charset=utf-8']
);
null, false, NaN, Infinity, and resource types.setStrictTypedProperties(true) in tests to catch uninitialized typed properties.$serializer->setObjectHandler('App\Models\ParentClass', function ($obj) {
return array_merge(
get_object_vars($obj),
['inherited_data' => 'custom_value']
);
});
$serialized = cache()->remember("serialized_{$key
How can I help you explore Laravel packages today?