api-platform: [2.4.0-beta2] Wrong JSON-LD and JSON single item response - ignores serialization groups?

On 2.4.0-beta1 when I ask for single resource (/api/contents/1.jsonld) I get:

{
   "@context":"/api/contexts/Content",
   "@id":"/api/contents/1",
   "@type":"Content",
   "id":1,
   "contentType":"homepage",
   "modifiedAt":"2018-06-19T16:18:20+00:00",
   "publishedAt":"2019-01-06T19:14:53+00:00",
   "fieldValues":{
      "title":"Labore reprehenderit dolorem repellendus asperiores.",
      "image":{
         "filename":"kitten.jpg",
         "alt":"A cute kitten",
         "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
      },
      "teaser":"Ut qui dolor debitis esse. Maiores alias repellat maxime ut voluptatem. Eum esse reprehenderit expedita necessitatibus. Animi hic eveniet sed et.\n\nEst pariatur incidunt aut iste. Rem aut nihil et ut natus perspiciatis. Dolore veritatis ab sed repellendus quo deleniti qui.\n\nQui laudantium corrupti labore quidem veniam nemo qui. Sit dolore atque et cumque libero. Omnis earum repellendus hic aut vero aut voluptatem. Ea non magni eligendi occaecati numquam.",
      "content":"Minus sed repellendus corporis nemo. Aut aut veniam at aut aliquid. Architecto tempora quia neque numquam voluptas sint est delectus.\n\nUnde voluptatem animi non ut aut dicta. Omnis vero dolorum aliquid laudantium magni asperiores. Et tempora eveniet soluta modi occaecati.\n\nEa dolorum tenetur voluptatum temporibus illo fuga. Quibusdam et doloribus debitis omnis sed. Tempora in aperiam ullam non odit. Praesentium sunt accusantium dolorem commodi labore eum nostrum quia.",
      "contentlink":"Aut ea iusto est iste est odit.",
      "slug":"labore-reprehenderit-dolorem-repellendus-asperiores"
   },
   "taxonomyValues":[

   ],
   "authorName":"Jane Doe",
   "extras":{
      "title":"Labore reprehenderit dolorem repellendus asperiores.",
      "image":{
         "filename":"kitten.jpg",
         "alt":"A cute kitten",
         "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
      },
      "excerpt":"Labore reprehenderit dolorem repellendus asperiores. Ut qui dolor debitis esse. Maiores alias …",
      "link":"/homepage/labore-reprehenderit-dolorem-repellendus-asperiores",
      "editLink":"/bolt/edit/1"
   }
}

Which is correct.

But after bumping version to 2.4.0-beta2 I get:

{
   "@context":"/api/contexts/Content",
   "@id":"/api/contents",
   "@type":"hydra:Collection",
   "hydra:member":[
      1,
      "homepage",
      "labore-reprehenderit-dolorem-repellendus-asperiores",
      {
         "id":3,
         "displayName":"Jane Doe",
         "username":"jane_admin",
         "email":"jane_admin@example.org"
      },
      {
         "title":"Labore reprehenderit dolorem repellendus asperiores.",
         "image":{
            "filename":"kitten.jpg",
            "alt":"A cute kitten",
            "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
         },
         "teaser":"Ut qui dolor debitis esse. Maiores alias repellat maxime ut voluptatem. Eum esse reprehenderit expedita necessitatibus. Animi hic eveniet sed et.\n\nEst pariatur incidunt aut iste. Rem aut nihil et ut natus perspiciatis. Dolore veritatis ab sed repellendus quo deleniti qui.\n\nQui laudantium corrupti labore quidem veniam nemo qui. Sit dolore atque et cumque libero. Omnis earum repellendus hic aut vero aut voluptatem. Ea non magni eligendi occaecati numquam.",
         "content":"Minus sed repellendus corporis nemo. Aut aut veniam at aut aliquid. Architecto tempora quia neque numquam voluptas sint est delectus.\n\nUnde voluptatem animi non ut aut dicta. Omnis vero dolorum aliquid laudantium magni asperiores. Et tempora eveniet soluta modi occaecati.\n\nEa dolorum tenetur voluptatum temporibus illo fuga. Quibusdam et doloribus debitis omnis sed. Tempora in aperiam ullam non odit. Praesentium sunt accusantium dolorem commodi labore eum nostrum quia.",
         "contentlink":"Aut ea iusto est iste est odit.",
         "slug":"labore-reprehenderit-dolorem-repellendus-asperiores"
      },
      [

      ],
      {
         "title":"Labore reprehenderit dolorem repellendus asperiores.",
         "image":{
            "filename":"kitten.jpg",
            "alt":"A cute kitten",
            "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
         },
         "excerpt":"Labore reprehenderit dolorem repellendus asperiores. Ut qui dolor debitis esse. Maiores alias …",
         "link":"/homepage/labore-reprehenderit-dolorem-repellendus-asperiores",
         "editLink":"/bolt/edit/1"
      },
      "published",
      "fa-home",
      "2018-03-25T03:58:54+00:00",
      "2018-06-19T16:18:20+00:00",
      "2019-01-06T19:14:53+00:00",
      "2019-02-13T22:01:37+00:00"
   ],
   "hydra:totalItems":13,
   "hydra:search":{
      "@type":"hydra:IriTemplate",
      "hydra:template":"/api/contents/1.jsonld{?id,id[],contentType,contentType[],status,status[],createdAt,createdAt[],modifiedAt,modifiedAt[],publishedAt,publishedAt[],depublishedAt,depublishedAt[]}",
      "hydra:variableRepresentation":"BasicRepresentation",
      "hydra:mapping":[
         {
            "@type":"IriTemplateMapping",
            "variable":"id",
            "property":"id",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"id[]",
            "property":"id",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"contentType",
            "property":"contentType",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"contentType[]",
            "property":"contentType",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"status",
            "property":"status",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"status[]",
            "property":"status",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"createdAt",
            "property":"createdAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"createdAt[]",
            "property":"createdAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"modifiedAt",
            "property":"modifiedAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"modifiedAt[]",
            "property":"modifiedAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"publishedAt",
            "property":"publishedAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"publishedAt[]",
            "property":"publishedAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"depublishedAt",
            "property":"depublishedAt",
            "required":false
         },
         {
            "@type":"IriTemplateMapping",
            "variable":"depublishedAt[]",
            "property":"depublishedAt",
            "required":false
         }
      ]
   }
}

Also JSON response is wrong in beta2 - looks like it ignores serialization groups.

Response in beta2 (invalid):

{
   "id":1,
   "contentType":"homepage",
   "slug":"labore-reprehenderit-dolorem-repellendus-asperiores",
   "author":{
      "id":3,
      "displayName":"Jane Doe",
      "username":"jane_admin",
      "email":"jane_admin@example.org"
   },
   "fields":{
      "title":"Labore reprehenderit dolorem repellendus asperiores.",
      "image":{
         "filename":"kitten.jpg",
         "alt":"A cute kitten",
         "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
      },
      "teaser":"Ut qui dolor debitis esse. Maiores alias repellat maxime ut voluptatem. Eum esse reprehenderit expedita necessitatibus. Animi hic eveniet sed et.\n\nEst pariatur incidunt aut iste. Rem aut nihil et ut natus perspiciatis. Dolore veritatis ab sed repellendus quo deleniti qui.\n\nQui laudantium corrupti labore quidem veniam nemo qui. Sit dolore atque et cumque libero. Omnis earum repellendus hic aut vero aut voluptatem. Ea non magni eligendi occaecati numquam.",
      "content":"Minus sed repellendus corporis nemo. Aut aut veniam at aut aliquid. Architecto tempora quia neque numquam voluptas sint est delectus.\n\nUnde voluptatem animi non ut aut dicta. Omnis vero dolorum aliquid laudantium magni asperiores. Et tempora eveniet soluta modi occaecati.\n\nEa dolorum tenetur voluptatum temporibus illo fuga. Quibusdam et doloribus debitis omnis sed. Tempora in aperiam ullam non odit. Praesentium sunt accusantium dolorem commodi labore eum nostrum quia.",
      "contentlink":"Aut ea iusto est iste est odit.",
      "slug":"labore-reprehenderit-dolorem-repellendus-asperiores"
   },
   "taxonomies":[

   ],
   "extras":{
      "title":"Labore reprehenderit dolorem repellendus asperiores.",
      "image":{
         "filename":"kitten.jpg",
         "alt":"A cute kitten",
         "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
      },
      "excerpt":"Labore reprehenderit dolorem repellendus asperiores. Ut qui dolor debitis esse. Maiores alias …",
      "link":"/homepage/labore-reprehenderit-dolorem-repellendus-asperiores",
      "editLink":"/bolt/edit/1"
   },
   "status":"published",
   "icon":"fa-home",
   "createdAt":"2018-03-25T03:58:54+00:00",
   "modifiedAt":"2018-06-19T16:18:20+00:00",
   "publishedAt":"2019-01-06T19:14:53+00:00",
   "depublishedAt":"2019-02-13T22:01:37+00:00"
}

Reponse in beta1 (valid):

{
   "id":1,
   "contentType":"homepage",
   "modifiedAt":"2018-06-19T16:18:20+00:00",
   "publishedAt":"2019-01-06T19:14:53+00:00",
   "fieldValues":{
      "title":"Labore reprehenderit dolorem repellendus asperiores.",
      "image":{
         "filename":"kitten.jpg",
         "alt":"A cute kitten",
         "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
      },
      "teaser":"Ut qui dolor debitis esse. Maiores alias repellat maxime ut voluptatem. Eum esse reprehenderit expedita necessitatibus. Animi hic eveniet sed et.\n\nEst pariatur incidunt aut iste. Rem aut nihil et ut natus perspiciatis. Dolore veritatis ab sed repellendus quo deleniti qui.\n\nQui laudantium corrupti labore quidem veniam nemo qui. Sit dolore atque et cumque libero. Omnis earum repellendus hic aut vero aut voluptatem. Ea non magni eligendi occaecati numquam.",
      "content":"Minus sed repellendus corporis nemo. Aut aut veniam at aut aliquid. Architecto tempora quia neque numquam voluptas sint est delectus.\n\nUnde voluptatem animi non ut aut dicta. Omnis vero dolorum aliquid laudantium magni asperiores. Et tempora eveniet soluta modi occaecati.\n\nEa dolorum tenetur voluptatum temporibus illo fuga. Quibusdam et doloribus debitis omnis sed. Tempora in aperiam ullam non odit. Praesentium sunt accusantium dolorem commodi labore eum nostrum quia.",
      "contentlink":"Aut ea iusto est iste est odit.",
      "slug":"labore-reprehenderit-dolorem-repellendus-asperiores"
   },
   "taxonomyValues":[

   ],
   "authorName":"Jane Doe",
   "extras":{
      "title":"Labore reprehenderit dolorem repellendus asperiores.",
      "image":{
         "filename":"kitten.jpg",
         "alt":"A cute kitten",
         "path":"/thumbs/kitten.jpg?w=240&h=160&area=files"
      },
      "excerpt":"Labore reprehenderit dolorem repellendus asperiores. Ut qui dolor debitis esse. Maiores alias …",
      "link":"/homepage/labore-reprehenderit-dolorem-repellendus-asperiores",
      "editLink":"/bolt/edit/1"
   }
}

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Comments: 17 (9 by maintainers)

Most upvoted comments

Actually the issue is that now the ItemNormalizer might be called even though:

  • it’s not a resource class (accepts anything since beta-2)
  • it’s not one of the following formats: json-ld, json-api, hal

Because the AbstractItemNormalizer::supportsNormalization almost always return true and that ApiPlatform\Core\Serializer\ItemNormalizer has no format check.

@JarJak the comment from @dunglas is something we need to implement so that you don’t face the issue by upgrading. Sorry for the inconvenience.

I can confirm that removing \JsonSerializable from Entity (Resource class) fixes the issue. However there is still something to think about: why in this example a single resource becomes a collection?

Proposal:

  • introfuce a new context option: use_api_platform
  • set it to false by default, except for formats fully managed by API Platform (JSON-LD, JSON:API, HAL)
  • switch it to true in our SerializerContextBuilder

It will fix such issues.