https://github.com/lookyman/json-mapper
Strict JSON to object hydrator based on PHPStan.
https://github.com/lookyman/json-mapper
json mapper phpstan
Last synced: about 1 year ago
JSON representation
Strict JSON to object hydrator based on PHPStan.
- Host: GitHub
- URL: https://github.com/lookyman/json-mapper
- Owner: lookyman
- License: mit
- Archived: true
- Created: 2021-12-29T09:59:26.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2022-01-03T10:14:15.000Z (over 4 years ago)
- Last Synced: 2025-02-23T14:30:36.208Z (over 1 year ago)
- Topics: json, mapper, phpstan
- Language: PHP
- Homepage:
- Size: 46.9 KB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# JSON Mapper
Strict JSON to object hydrator based on [PHPStan](https://phpstan.org/).
## Usage
```php
use Lookyman\JsonMapper\MapperBuilder
use PHPUnit\Framework\Assert;
class Foo
{
public function __construct(public string $foo)
{
}
}
class Bar
{
public function __construct(public Foo $first)
{
}
}
$result = (new MapperBuilder())
->build()
->map(Bar::class, '{"first":{"foo":"wtf"}}');
Assert::assertEquals(
new Bar(new Foo('wtf')),
$result,
);
```
If the parameter is not present in source, and has a scalar default value, it will be assigned that value.
If the parameter is not present in source, but is nullable, it will be assigned a `NULL` value.
If the source contains keys not present in parameter names, those will be ignored.
Otherwise, we do not do any guessing or type casting.
In case of any error, `Lookyman\JsonMapper\Exception\MapperException` is thrown.
## Supported types
* Scalars (including literals and integer ranges),
* arrays (including associative and shapes),
* iterables,
* `class-string` (including generic),
* `object`,
* normal class objects (including generic),
* unions (including nullable parameters),
* backed enums.
See [PHPStan documentation](https://phpstan.org/writing-php-code/phpdoc-types) and `tests` directory for examples.
## Caveats
All classes must be instantiable with a public constructor.
If your types contain interfaces or abstract classes, use `MapperBuilder::withClassMapping` to provide a map to concrete classes.
## Questions?
This is a pet project I played with over the 2021 end of year holidays, because I saw [@Ocramius](https://twitter.com/Ocramius) looking for a similar library a few weeks earlier.
At the moment, I have no ambitions with it, I just wanted to see if this approach is feasible.
It probably contains a lot of bugs.
If you have any questions, the answer is probably "I don't know".
If you have any requests, I will probably not respond.
But I reserve the right to change my mind at any point.