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
./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.