diff --git a/CHANGELOG.md b/CHANGELOG.md index 73ecc173c..69c9d9f60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed +- fixes #446 maxLength and minLength do not work when a number with a zero decimal is used + ## 1.0.65 - 2022-01-07 ### Changed diff --git a/doc/config.md b/doc/config.md index be7d66a2a..d03544b72 100644 --- a/doc/config.md +++ b/doc/config.md @@ -55,3 +55,11 @@ When set to true, use Java-specific semantics rather than native JavaScript sema For example, if the node type is `number` per JS semantics where the value can be losslesly interpreted as `java.lang.Long`, the validator would use `integer` as the node type instead of `number`. This is useful when schema type is `integer`, since validation would fail otherwise. For more details, please refer to this [issue](https://github.com/networknt/json-schema-validator/issues/334). + +* losslessNarrowing + +When set to true, can interpret round doubles as integers. + +Note that setting `javaSemantics = true` will achieve the same functionality at this time. + +For more details, please refer to this [issue](https://github.com/networknt/json-schema-validator/issues/344). \ No newline at end of file diff --git a/src/main/java/com/networknt/schema/TypeFactory.java b/src/main/java/com/networknt/schema/TypeFactory.java index 71bb8ea5f..d44ff9c93 100644 --- a/src/main/java/com/networknt/schema/TypeFactory.java +++ b/src/main/java/com/networknt/schema/TypeFactory.java @@ -72,9 +72,9 @@ public static JsonType getValueNodeType(JsonNode node, SchemaValidatorsConfig co if (node.isIntegralNumber()) return JsonType.INTEGER; if (node.isNumber()) - if (config != null && config.isJavaSemantics() && node.canConvertToLong() && (node.asText().indexOf('.') == -1)) + if (config != null && config.isJavaSemantics() && node.canConvertToExactIntegral()) return JsonType.INTEGER; - else if (config!= null && config.isLosslessNarrowing() && node.asText().endsWith(".0")) + else if (config != null && config.isLosslessNarrowing() && node.canConvertToExactIntegral()) return JsonType.INTEGER; else return JsonType.NUMBER; diff --git a/src/test/java/com/networknt/schema/TypeFactoryTest.java b/src/test/java/com/networknt/schema/TypeFactoryTest.java index b1445276d..5377bc464 100755 --- a/src/test/java/com/networknt/schema/TypeFactoryTest.java +++ b/src/test/java/com/networknt/schema/TypeFactoryTest.java @@ -28,29 +28,43 @@ public class TypeFactoryTest { private static final String[] validIntegralValues = { "1", "-1", "0E+1", "0E1", "-0E+1", "-0E1", "10.1E+1", "10.1E1", "-10.1E+1", "-10.1E1", "1E+0", "1E-0", - "1E0", "1E18", "9223372036854775807", "-9223372036854775808" + "1E0", "1E18", "9223372036854775807", "-9223372036854775808", "1.0", "1.00", "-1.0", "-1.00" + }; + + private static final String[] validNonIntegralNumberValues = { + "1.1", "-1.1", "1.10" }; private final SchemaValidatorsConfig schemaValidatorsConfig = new SchemaValidatorsConfig(); @Test - public void testValidIntegralValuesWithJavaSemantics() { + public void testIntegralValuesWithJavaSemantics() { schemaValidatorsConfig.setJavaSemantics(true); for (String validValue : validIntegralValues) { assertSame(JsonType.INTEGER, getValueNodeType(DecimalNode.valueOf(new BigDecimal(validValue)), schemaValidatorsConfig), validValue); } + for (String validValue : validNonIntegralNumberValues) { + assertSame(JsonType.NUMBER, + getValueNodeType(DecimalNode.valueOf(new BigDecimal(validValue)), schemaValidatorsConfig), + validValue); + } } @Test - public void testValidIntegralValuesWithoutJavaSemantics() { + public void testIntegralValuesWithoutJavaSemantics() { schemaValidatorsConfig.setJavaSemantics(false); for (String validValue : validIntegralValues) { assertSame(JsonType.NUMBER, getValueNodeType(DecimalNode.valueOf(new BigDecimal(validValue)), schemaValidatorsConfig), validValue); } + for (String validValue : validNonIntegralNumberValues) { + assertSame(JsonType.NUMBER, + getValueNodeType(DecimalNode.valueOf(new BigDecimal(validValue)), schemaValidatorsConfig), + validValue); + } } @@ -82,4 +96,4 @@ public void testWithoutLosslessNarrowing() { } } -} \ No newline at end of file +}