diff --git a/src/main/java/com/networknt/schema/SchemaValidatorsConfig.java b/src/main/java/com/networknt/schema/SchemaValidatorsConfig.java index 9f91d1ada..2fa989950 100644 --- a/src/main/java/com/networknt/schema/SchemaValidatorsConfig.java +++ b/src/main/java/com/networknt/schema/SchemaValidatorsConfig.java @@ -42,6 +42,11 @@ public class SchemaValidatorsConfig { */ private boolean javaSemantics; + /** + * When set to true, can interpret round doubles as integers + */ + private boolean losslessNarrowing; + /** * Map of public, normally internet accessible schema URLs to alternate locations; this allows for offline * validation of schemas that refer to public URLs. This is merged with any mappings the {@link JsonSchemaFactory} @@ -192,5 +197,12 @@ public CollectorContext getCollectorContext() { public void setCollectorContext(CollectorContext collectorContext) { this.collectorContext = collectorContext; } - + + public boolean isLosslessNarrowing() { + return losslessNarrowing; + } + + public void setLosslessNarrowing(boolean losslessNarrowing) { + this.losslessNarrowing = losslessNarrowing; + } } diff --git a/src/main/java/com/networknt/schema/TypeFactory.java b/src/main/java/com/networknt/schema/TypeFactory.java index e3a9645a0..3e0693d23 100644 --- a/src/main/java/com/networknt/schema/TypeFactory.java +++ b/src/main/java/com/networknt/schema/TypeFactory.java @@ -74,6 +74,8 @@ public static JsonType getValueNodeType(JsonNode node, SchemaValidatorsConfig co if (node.isNumber()) if (config.isJavaSemantics() && node.canConvertToLong() && (node.asText().indexOf('.') == -1)) return JsonType.INTEGER; + else if (config.isLosslessNarrowing() && node.asText().endsWith(".0")) + return JsonType.INTEGER; else return JsonType.NUMBER; if (node.isBoolean()) diff --git a/src/test/java/com/networknt/schema/TypeFactoryTest.java b/src/test/java/com/networknt/schema/TypeFactoryTest.java index 01f15ca1a..a1ab4d535 100755 --- a/src/test/java/com/networknt/schema/TypeFactoryTest.java +++ b/src/test/java/com/networknt/schema/TypeFactoryTest.java @@ -50,4 +50,24 @@ public void testValidIntegralValuesWithoutJavaSemantics() { getValueNodeType(DecimalNode.valueOf(new BigDecimal(validValue)), schemaValidatorsConfig)); } } + + @Test + public void testWithLosslessNarrowing() { + schemaValidatorsConfig.setLosslessNarrowing(true); + assertSame(validValue, JsonType.INTEGER, + getValueNodeType(DecimalNode.valueOf(new BigDecimal("1.0")), schemaValidatorsConfig)); + + assertSame(validValue, JsonType.NUMBER, + getValueNodeType(DecimalNode.valueOf(new BigDecimal("1.5")), schemaValidatorsConfig)); + } + + @Test + public void testWithoutLosslessNarrowing() { + schemaValidatorsConfig.setLosslessNarrowing(false); + assertSame(validValue, JsonType.NUMBER, + getValueNodeType(DecimalNode.valueOf(new BigDecimal("1.0")), schemaValidatorsConfig)); + + assertSame(validValue, JsonType.NUMBER, + getValueNodeType(DecimalNode.valueOf(new BigDecimal("1.5")), schemaValidatorsConfig)); + } }