English spoken conference

Symfony 5: The Fast Track

A new book to learn about developing modern Symfony 5 applications.

Support this project

New in Symfony 4.3: JSON validation

Contributed by
Imad Zairig
in #28477.

JSON is arguably the most used format in applications developed with Symfony. You probably make requests to JSON APIs and send/receive JSON payloads in your projects. That's why Symfony provides a JsonResponse class, a way to build JSON authentication, full JSON support in the Serializer component, a json() helper for controllers, etc.

In Symfony 4.3 we improved the Validator component to add a new Json constraint, which can be applied to properties and getters, and ensures that the given contents are valid JSON contents:

  • Annotations
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    // src/Entity/Book.php
    namespace App\Entity;
    
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Book
    {
        /**
         * @Assert\Json(message = "This is not valid JSON")
         */
         protected $chapters;
    }
    
  • YAML
    1
    2
    3
    4
    5
    6
    # config/validator/validation.yaml
    App\Entity\Book:
        properties:
            chapters:
                - Json:
                    message: 'This is not valid JSON'
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <!-- config/validator/validation.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <constraint-mapping xmlns="http://symfony.com/schema/dic/constraint-mapping"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/constraint-mapping http://symfony.com/schema/dic/constraint-mapping/constraint-mapping-1.0.xsd">
        <class name="App\Entity\Book">
             <property name="chapters">
                <constraint name="Json">
                    <option name="message">This is not valid JSON</option>
                </constraint>
            </property>
        </class>
    </constraint-mapping>
    
  • PHP
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    // src/Entity/Book.php
    namespace App\Entity;
    
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class Book
    {
        protected $chapters;
    
        public static function loadValidatorMetadata(ClassMetadata $metadata)
        {
            $metadata->addPropertyConstraint('chapters', new Assert\Json(array(
                'message' => 'This is not valid JSON',
            )));
        }
    }
    

Comments

Amazing news!
Terrific !!
Thank you
Good news !!
Good news !! Thanks
Well done,
Finally :-) ! Thank you !
Need more complete work with json in Request object.
example:
```php
public function confirmEmail(Request $request): JsonResponse
{
$token = \json_decode($request->getContent(), true)['token'] ?? null;
return $this->json($token);
}
```
vs
```php
public function confirmEmail(Request $request): JsonResponse
{
// json/getJson... etc.
$token = $request->jsonBody()->get('token');
return $this->json($token);
}
```
Sounds Great. Well done.
Finally. Thank you!
What do You think about adding json schema validation?

Comments are closed.

To ensure that comments stay relevant, they are closed for old posts.