Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\Serializer\Normalizer; Chris@0: Chris@0: use Symfony\Component\Serializer\Exception\InvalidArgumentException; Chris@0: use Symfony\Component\Serializer\Exception\LogicException; Chris@0: Chris@0: /** Chris@0: * A normalizer that uses an objects own JsonSerializable implementation. Chris@0: * Chris@0: * @author Fred Cox Chris@0: */ Chris@0: class JsonSerializableNormalizer extends AbstractNormalizer Chris@0: { Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function normalize($object, $format = null, array $context = []) Chris@0: { Chris@0: if ($this->isCircularReference($object, $context)) { Chris@0: return $this->handleCircularReference($object); Chris@0: } Chris@0: Chris@0: if (!$object instanceof \JsonSerializable) { Chris@0: throw new InvalidArgumentException(sprintf('The object must implement "%s".', \JsonSerializable::class)); Chris@0: } Chris@0: Chris@0: if (!$this->serializer instanceof NormalizerInterface) { Chris@0: throw new LogicException('Cannot normalize object because injected serializer is not a normalizer'); Chris@0: } Chris@0: Chris@0: return $this->serializer->normalize($object->jsonSerialize(), $format, $context); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function supportsNormalization($data, $format = null) Chris@0: { Chris@0: return $data instanceof \JsonSerializable; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function supportsDenormalization($data, $type, $format = null) Chris@0: { Chris@0: return false; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@17: public function denormalize($data, $class, $format = null, array $context = []) Chris@0: { Chris@0: throw new LogicException(sprintf('Cannot denormalize with "%s".', \JsonSerializable::class)); Chris@0: } Chris@0: }