Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Merge requests
  • !12891

Perl: Type coercion for the JSON conversion part of Perl

  • Review changes

  • Download
  • Email patches
  • Plain diff
Merged Administrator requested to merge github/fork/AnaTofuZ/fix_perl_types into master Jul 16, 2022
  • Overview 4
  • Commits 5
  • Pipelines 0
  • Changes 60

Created by: AnaTofuZ

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package 
    ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    Commit all changed files. This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master. These must match the expectations made by your contribution. You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*. For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master (6.1.0) (minor release - breaking changes with fallbacks), 7.0.x (breaking changes without fallbacks)
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.

@wing328 @yue9944882


Execute the following Perl code In this case, photoUrls is retyped as Array[boolean] for illustration purposes.

use strict;
use warnings;

use WWW::OpenAPIClient::Object::Pet;

use JSON;

my $pet = WWW::OpenAPIClient::Object::Pet->new->from_hash({id => '123', photoUrls => [123, 'bbb', 421, !!0]});
my $json = JSON->new->convert_blessed->encode($pet);
print "$json\n";

The JSON generated by Perl is as follows

{"photoUrls":[123,"bbb",421,""],"id":"123","tags":[]}

However, we originally want to get the following JSON

  • id is 123 (number) instead of "123"(string)
  • photoUrls is [true,true,true,false] instead of [123, "bbbb",421,""].
{"photoUrls":[true,true,true,false],"id":123,"tags":[]}

This is mainly due to the behavior of Perl's JSON library. https://metacpan.org/pod/JSON#simple-scalars

Perl variables are not strictly distinguished between strings and numbers, so the type of the value depends on how it is evaluated before being converted to JSON.

This means that the type can change inside the OpenAPI library not only when converting to JSON, but also when converting from JSON. Therefore, the type is enforced at the place of conversion to JSON and at the timing of setting the value to Object. Note that we do not check the argument when creating an object with new.(However, type coercion is performed when converting to JSON)


In addition, there were the following problems with JSON conversion.

use strict;
use warnings;

use WWW::OpenAPIClient::Object::MixedPropertiesAndAdditionalPropertiesClass;
use JSON;
my $class = WWW::OpenAPIClient::Object::MixedPropertiesAndAdditionalPropertiesClass->new->from_hash({ dateTime => '2020-11-06T09:20:48Z'});
  my $json = JSON->new->convert_blessed->encode($class);
  print $json;

get error

encountered object '2020-11-06T09:20:48', but neither allow_blessed, convert_blessed nor allow_tags settings are enabled (or TO_JSON/FREEZE method missing) at sample.pl line 17.

This is because OpenAPI uses TO_JSON to convert to a hash ref that is passed to the JSON module, but the DateTime module does not provide TO_JSON. This occurs when initializing the object using from_hash. The solution is to convert the DateTime module to a string. In this case, the values need to be different, so the OpenAPI date and date-time have been changed to distinguish between internal types. This is a destructive change.

Assignee
Assign to
Reviewers
Request review from
Time tracking
Source branch: github/fork/AnaTofuZ/fix_perl_types