Description
This exception happens when I create a schema with a properties that has a contain the same words separated by underscore. Please see the example schema below:
$item_schema = [
'title' => 'Invoice Items',
'type' => 'array',
'items' => [
'type' => 'object',
'properties' => [
'quantity' => [
'title' => 'Quantity',
'type' => 'number',
'min' => 0,
],
'quantity_unit' => [
'title' => 'Quantity Unit',
'type' => 'string',
"format" => "text",
],
'title' => [
'title' => 'title',
'type' => 'string',
"format" => "text",
],
],
],
];`
`
The above schema gives an exception as below during validation. The "unit(s)" is a value of the property quantity_unit.
`
JsonSchema\Exception\InvalidArgumentException
unit(s) is an invalid type for string|null
1. in /.../vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php at line 214
if ('email' === $type) {
return is_string($value);
}
if ('null' === $type) {
return is_null($value);
}
throw new InvalidArgumentException((is_object($value) ? 'object' : $value) . ' is an invalid type for ' . $type);
}
/**
* Converts a value to boolean. For example, "true" becomes true.
*
* @param $value The value to convert to boolean
*
* @return bool|mixed
*/
`
If I rename the property quantity_unit
to qty_unit
or something else, it works but does not work if any other properties contain the name "quantity" separated by an underscore, it throws the above exception.
It seems because there is an existing property called quantity
, no other property can have a name containing quantity.
To reproduce the issue, you can use the schema above to create a sample json data and try to validate
$data = [ 'title' => 'Hp Laptop', 'quantity' => 10, 'quantity_unit' => 'unit(s)', ];
This throws the exception below
JsonSchema\Exception\InvalidArgumentException
unit(s) is an invalid type for string|null
1. in /.../vendor/justinrainbow/json-schema/src/JsonSchema/Constraints/TypeConstraint.php at line 214
if ('email' === $type) {
return is_string($value);
}
if ('null' === $type) {
return is_null($value);
}
throw new InvalidArgumentException((is_object($value) ? 'object' : $value) . ' is an invalid type for ' . $type);
}
/**
* Converts a value to boolean. For example, "true" becomes true.
*
* @param $value The value to convert to boolean
*
* @return bool|mixed
*/