-
-
Notifications
You must be signed in to change notification settings - Fork 9.6k
[Serializer] Add deserializing to an array of objects #12066
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
Added a deserializeCollection method to the Serializer that,after the decoding stage, denormalizes each element of the resulting array, rather than the array itself.
👍 Would love to see this feature implemented soon! :) |
Maybe I've missed something but isn't this feature already present in Maybe this logic should be moved in |
@acleon is this PR still useful (see my previous comment)? |
Closing as there is no feedback. |
This PR was merged into the 2.8 branch. Discussion ---------- [Serializer] Support for array denormalization | Q | A | ------------- | --- | Bug fix? | no | New feature? | yes | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | none | License | MIT | Doc PR | none (yet) This is a rebase of #14343 against the 2.8 branch. I had to implement a couple of API endpoints that receive data as JSON-serialized arrays of objects. The current implementation of the Serializer component is capable of serializing such arrays, but so far this operation is a one-way-road. This PR is an attempt to change this. ## Demo ```php class Dummy { public $foo; public $bar; public function __construct($foo = null, $bar = null) { $this->foo = $foo; $this->bar = $bar; } } $serializer = new \Symfony\Component\Serializer\Serializer( array( new \Symfony\Component\Serializer\Normalizer\PropertyNormalizer(), new \Symfony\Component\Serializer\Normalizer\ArrayDenormalizer() ), array( new \Symfony\Component\Serializer\Encoder\JsonEncoder() ) ); $json = $serializer->serialize( array( new Dummy('one', 'two'), new Dummy('three', 'four') ), 'json' ); echo $json . "\n\n"; // Deserialize the JSON string, so we get back to where we started from. $data = $serializer->deserialize($json, 'Dummy[]', 'json'); var_dump($data); ``` By appending `[]` to the type parameter, you indicate that you expect to deserialize an array of objects of the given type. This is the same notation that phpDocumentor uses to indicate collections. The denormalization of the array is implemented recursively: The denormalizer simply calls `Serializer::denormalize()` on each element of the array. This way, the ArrayDenormalizer can be combined with any other denormalizer. ## Side effects For this implementation, I had to touch `GetSetMethodNormalizer`, `PropertyNormalizer` and `CustomNormalizer`. Those classes expected `supportsDenormalization` to be called with a valid class in the `$type` parameter. Instead of throwing a reflection exception, they now simply return false. I'm not exactly sure, if this is should be considered to be a BC break. This implementation violates the `SerializerInterface` which declared `deserialize()` to always return an object. But imho, the assumption that serialized data always represents an object is too restrictive anyway. Also, this declaration is not consistent with the `serialize()` method which accepts `mixed` as input type for the data to serialize. ## Other PRs I've found an older PR adressing this issue, #12066. That PR was closed because the contributor did not reply to feedback. Commits ------- 0573f28 Support for array denormalization.
Adds a
deserializeCollection
method to the Serializer so that collections of models can be deserialized without having to split out the decoding and denormalization stages yourself, or having to create a custom denormalizer for the collection.