Loading src/main/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGenerator.scala +16 −3 Original line number Diff line number Diff line Loading @@ -27,7 +27,8 @@ object JsonSchemaConfig { useHTML5DateTimeLocal = false, autoGenerateTitleForProperties = false, defaultArrayFormat = None, useOneOfForOption = false useOneOfForOption = false, usePropertyOrdering = false ) /** Loading @@ -42,7 +43,8 @@ object JsonSchemaConfig { useHTML5DateTimeLocal = true, autoGenerateTitleForProperties = true, defaultArrayFormat = Some("table"), useOneOfForOption = true useOneOfForOption = true, usePropertyOrdering = true ) } Loading @@ -51,7 +53,8 @@ case class JsonSchemaConfig useHTML5DateTimeLocal:Boolean, autoGenerateTitleForProperties:Boolean, defaultArrayFormat:Option[String], useOneOfForOption:Boolean useOneOfForOption:Boolean, usePropertyOrdering:Boolean ) Loading Loading @@ -442,6 +445,11 @@ class JsonSchemaGenerator Some(new JsonObjectFormatVisitor with MySerializerProvider { // Used when rendering schema using propertyOrdering as specified here: // https://github.com/jdorn/json-editor#property-ordering var nextPropertyOrderIndex = 1 def myPropertyHandler(propertyName:String, propertyType:JavaType, prop: Option[BeanProperty], jsonPropertyRequired:Boolean): Unit = { l(s"JsonObjectFormatVisitor - ${propertyName}: ${propertyType}") Loading @@ -453,6 +461,11 @@ class JsonSchemaGenerator val thisPropertyNode = JsonNodeFactory.instance.objectNode() propertiesNode.set(propertyName, thisPropertyNode) if ( config.usePropertyOrdering ) { thisPropertyNode.put("propertyOrder", nextPropertyOrderIndex) nextPropertyOrderIndex = nextPropertyOrderIndex + 1 } // Check for Option/Optional-special-case if ( config.useOneOfForOption && ( classOf[Option[_]].isAssignableFrom(propertyType.getRawClass) Loading src/test/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGeneratorTest.scala +19 −1 Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ import java.util.{Optional, TimeZone} import com.fasterxml.jackson.annotation.{JsonProperty, JsonSubTypes, JsonTypeInfo, JsonValue} import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, ObjectNode} import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, NullNode, ObjectNode} import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper, SerializationFeature} import com.fasterxml.jackson.datatype.jdk8.Jdk8Module import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule Loading Loading @@ -554,6 +554,24 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { assert(schema.at("/properties/optionalList/title").asText() == "Optional List") } test("propertyOrdering") { { val jsonNode = assertToFromJson(jsonSchemaGeneratorHTML5, testData.classNotExtendingAnything) val schema = generateAndValidateSchema(jsonSchemaGeneratorHTML5, testData.classNotExtendingAnything.getClass, Some(jsonNode)) assert(schema.at("/properties/someString/propertyOrder").asInt() == 1) assert(schema.at("/properties/myEnum/propertyOrder").asInt() == 2) } // Make sure propertyOrder is not enabled when not using html5 { val jsonNode = assertToFromJson(jsonSchemaGenerator, testData.classNotExtendingAnything) val schema = generateAndValidateSchema(jsonSchemaGenerator, testData.classNotExtendingAnything.getClass, Some(jsonNode)) assert(schema.at("/properties/someString/propertyOrder").isMissingNode == true) } } } trait TestData { Loading Loading
src/main/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGenerator.scala +16 −3 Original line number Diff line number Diff line Loading @@ -27,7 +27,8 @@ object JsonSchemaConfig { useHTML5DateTimeLocal = false, autoGenerateTitleForProperties = false, defaultArrayFormat = None, useOneOfForOption = false useOneOfForOption = false, usePropertyOrdering = false ) /** Loading @@ -42,7 +43,8 @@ object JsonSchemaConfig { useHTML5DateTimeLocal = true, autoGenerateTitleForProperties = true, defaultArrayFormat = Some("table"), useOneOfForOption = true useOneOfForOption = true, usePropertyOrdering = true ) } Loading @@ -51,7 +53,8 @@ case class JsonSchemaConfig useHTML5DateTimeLocal:Boolean, autoGenerateTitleForProperties:Boolean, defaultArrayFormat:Option[String], useOneOfForOption:Boolean useOneOfForOption:Boolean, usePropertyOrdering:Boolean ) Loading Loading @@ -442,6 +445,11 @@ class JsonSchemaGenerator Some(new JsonObjectFormatVisitor with MySerializerProvider { // Used when rendering schema using propertyOrdering as specified here: // https://github.com/jdorn/json-editor#property-ordering var nextPropertyOrderIndex = 1 def myPropertyHandler(propertyName:String, propertyType:JavaType, prop: Option[BeanProperty], jsonPropertyRequired:Boolean): Unit = { l(s"JsonObjectFormatVisitor - ${propertyName}: ${propertyType}") Loading @@ -453,6 +461,11 @@ class JsonSchemaGenerator val thisPropertyNode = JsonNodeFactory.instance.objectNode() propertiesNode.set(propertyName, thisPropertyNode) if ( config.usePropertyOrdering ) { thisPropertyNode.put("propertyOrder", nextPropertyOrderIndex) nextPropertyOrderIndex = nextPropertyOrderIndex + 1 } // Check for Option/Optional-special-case if ( config.useOneOfForOption && ( classOf[Option[_]].isAssignableFrom(propertyType.getRawClass) Loading
src/test/scala/com/kjetland/jackson/jsonSchema/JsonSchemaGeneratorTest.scala +19 −1 Original line number Diff line number Diff line Loading @@ -7,7 +7,7 @@ import java.util.{Optional, TimeZone} import com.fasterxml.jackson.annotation.{JsonProperty, JsonSubTypes, JsonTypeInfo, JsonValue} import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.databind.module.SimpleModule import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, ObjectNode} import com.fasterxml.jackson.databind.node.{ArrayNode, MissingNode, NullNode, ObjectNode} import com.fasterxml.jackson.databind.{JsonNode, ObjectMapper, SerializationFeature} import com.fasterxml.jackson.datatype.jdk8.Jdk8Module import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule Loading Loading @@ -554,6 +554,24 @@ class JsonSchemaGeneratorTest extends FunSuite with Matchers { assert(schema.at("/properties/optionalList/title").asText() == "Optional List") } test("propertyOrdering") { { val jsonNode = assertToFromJson(jsonSchemaGeneratorHTML5, testData.classNotExtendingAnything) val schema = generateAndValidateSchema(jsonSchemaGeneratorHTML5, testData.classNotExtendingAnything.getClass, Some(jsonNode)) assert(schema.at("/properties/someString/propertyOrder").asInt() == 1) assert(schema.at("/properties/myEnum/propertyOrder").asInt() == 2) } // Make sure propertyOrder is not enabled when not using html5 { val jsonNode = assertToFromJson(jsonSchemaGenerator, testData.classNotExtendingAnything) val schema = generateAndValidateSchema(jsonSchemaGenerator, testData.classNotExtendingAnything.getClass, Some(jsonNode)) assert(schema.at("/properties/someString/propertyOrder").isMissingNode == true) } } } trait TestData { Loading