Problem/Motivation

It seems that fields of type "Number (float)" are not currently supported by this module.

This message appears in watchdog when trying to view schema for a float field:

float is not a valid type for a JSON document.

Steps to reproduce

Create an entity with a "Number (float)" field and look at the schema of that field. It is null.

Proposed resolution

TBD

Remaining tasks

TBD

User interface changes

None.

API changes

None.

Data model changes

Provide proper JSON Schema for float values.

CommentFileSizeAuthor
#4 3256795-4.patch709 bytesm.stenta
Command icon Show commands

Start within a Git clone of the project using the version control instructions.

Or, if you do not have SSH keys set up on git.drupalcode.org:

Comments

m.stenta created an issue. See original summary.

m.stenta’s picture

I spent a little time digging into this with XDebug. I found the following line in class DataDefinitionNormalizer:

const JSON_TYPES = ['null', 'boolean', 'string', 'number', 'integer', 'array', 'object'];

https://git.drupalcode.org/project/jsonapi_schema/-/blob/4f4f1b18fd9fe8f...

This gets used in that class's normalize() method:

https://git.drupalcode.org/project/jsonapi_schema/-/blob/4f4f1b18fd9fe8f...

It seems that adding float to the JSON_TYPES array fixes the issue... sort of... instead of null the schema for my float field is now:

{
  "type": "float",
  "title": "test float field"
}

However, "type": "float" is not a valid JSON Schema type. According to https://json-schema.org/understanding-json-schema/reference/numeric.html, float should be "type": "number".

I could add a simple conditional in that class to convert float to number, but that's probably not the "correct" place to handle this.

If anyone can point me in the right direction I'm happy to provide a patch! :-)

m.stenta’s picture

Issue summary: View changes
m.stenta’s picture

Status: Active » Needs review
StatusFileSize
new709 bytes

I could add a simple conditional in that class to convert float to number, but that's probably not the "correct" place to handle this.

Here is a ROUGH patch that does this. But as described above, I don't think this is the "correct" approach. Nevertheless, the patch is a quick fix for anyone who needs it (can be applied via cweagans/composer-patches).

Status: Needs review » Needs work

The last submitted patch, 4: 3256795-4.patch, failed testing. View results

bradjones1’s picture

m.stenta’s picture

Title: Float fields have a null schema » Decimal and float fields have a null schema
Priority: Normal » Major

This also applies to decimal fields. Updating title and description accordingly.

Also, marking this as "Major" because including either of these field types in an entity bundle crashes the schema for that bundle with the following error. This may have changed recently due to upstream changes in Symfony, because I don't think I experienced this originally, but it was also reported in #3491229: Decimal field causes error message on custom entity.

The website encountered an unexpected error. Try again later.

TypeError: Symfony\Component\Serializer\Serializer::normalize(): Return value must be of type ArrayObject|array|string|int|float|bool|null, stdClass returned in Symfony\Component\Serializer\Serializer->normalize() (line 161 of /var/lib/tugboat/stm/vendor/symfony/serializer/Serializer.php).

Drupal\jsonapi_schema\Normalizer\ListDataDefinitionNormalizer->normalize(Object, 'schema_json', Array) (Line: 32)
Drupal\jsonapi_schema\Normalizer\FieldDefinitionNormalizer->normalize(Object, 'schema_json', Array) (Line: 161)
Symfony\Component\Serializer\Serializer->normalize(Object, 'schema_json', Array) (Line: 232)
Drupal\jsonapi_schema\Controller\JsonApiSchemaController->Drupal\jsonapi_schema\Controller\{closure}(Array, Object)
array_reduce(Array, Object, Array) (Line: 231)
Drupal\jsonapi_schema\Controller\JsonApiSchemaController->addFieldsSchema(Array, Object) (Line: 210)
Drupal\jsonapi_schema\Controller\JsonApiSchemaController->getResourceObjectSchema(Object, Object)
call_user_func_array(Array, Array) (Line: 123)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 638)
Drupal\Core\Render\Renderer->executeInRenderContext(Object, Object) (Line: 121)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->wrapControllerExecutionInRenderContext(Array, Array) (Line: 97)
Drupal\Core\EventSubscriber\EarlyRenderingControllerWrapperSubscriber->Drupal\Core\EventSubscriber\{closure}() (Line: 181)
Symfony\Component\HttpKernel\HttpKernel->handleRaw(Object, 1) (Line: 76)
Symfony\Component\HttpKernel\HttpKernel->handle(Object, 1, 1) (Line: 53)
Drupal\Core\StackMiddleware\Session->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\KernelPreHandle->handle(Object, 1, 1) (Line: 28)
Drupal\Core\StackMiddleware\ContentLength->handle(Object, 1, 1) (Line: 32)
Drupal\big_pipe\StackMiddleware\ContentLength->handle(Object, 1, 1) (Line: 116)
Drupal\page_cache\StackMiddleware\PageCache->pass(Object, 1, 1) (Line: 90)
Drupal\page_cache\StackMiddleware\PageCache->handle(Object, 1, 1) (Line: 48)
Drupal\Core\StackMiddleware\ReverseProxyMiddleware->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\NegotiationMiddleware->handle(Object, 1, 1) (Line: 36)
Drupal\Core\StackMiddleware\AjaxPageState->handle(Object, 1, 1) (Line: 51)
Drupal\Core\StackMiddleware\StackedHttpKernel->handle(Object, 1, 1) (Line: 741)
Drupal\Core\DrupalKernel->handle(Object) (Line: 19)

I've learned a lot about how this module works since I posted the patch in #4. The correct approach is to provide a new normalizer class that declares supported types of decimal and float. I will open a merge request with tests shortly...

m.stenta’s picture

Status: Needs work » Needs review

  • m.stenta committed 8ece8e8b on 8.x-1.x
    Issue #3256795: Decimal and float fields have a null schema
    
m.stenta’s picture

Status: Needs review » Fixed

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.