json 如何使fasterXmlObjectMapper将格式属性放入long类型字段的模式中

a11xaf1n  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(129)

如何让ObjectMapper为类的生成模式中的一些属性设置format字段?
我正在尝试使用FasterXml库为java类生成模式:

<dependency>
  <groupId>com.fasterxml.jackson.module</groupId>
  <artifactId>jackson-module-jsonSchema</artifactId>
  <version>2.14.1</version>
</dependency>
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.14.1</version>
  <scope>compile</scope>
</dependency>

试验:

@SneakyThrows
@Test
public void test() {
    ObjectMapper objectMapper = new ObjectMapper();
    SchemaFactoryWrapper schemaVisitor = new SchemaFactoryWrapper();
    objectMapper.acceptJsonFormatVisitor(objectMapper.constructType(MyClass.class), schemaVisitor);
    System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(schemaVisitor.finalSchema()));
}

@Data
public static class MyClass {
    private int myInt;
    private long myLong;
}

结果是这样的:

{
   "type":"object",
   "id":"urn:jsonschema:........:MyClass",
   "properties":{
      "myInt":{
         "type":"integer"
      },
      "myLong":{
         "type":"integer"
      }
   }
}

这两种类型都很好,但我希望为属性myLong设置"format": "int64"

mefy6pfw

mefy6pfw1#

Json Schema没有引入int64类型,只有numberinteger两种类型,看枚举JsonFormatTypesJsonSchema模块使用它。要扩展它,您必须扩展大量的类,并以某种方式欺骗内部机制,将integer替换为int64,这在最后会生成误导性的模式,这是可以理解的只为你。所有其他库和工具都不能识别它。我建议使用com.fasterxml.jackson.annotation.JsonPropertyDescription注解long属性:

class MyClass {

    private int myInt;

    @JsonPropertyDescription("int64")
    private long myLong;
}

它会产生这样的结果:

{
  "type" : "object",
  "id" : "urn:jsonschema:com:example:MyClass",
  "properties" : {
    "myInt" : {
      "type" : "integer"
    },
    "myLong" : {
      "type" : "integer",
      "description" : "int64"
    }
  }
}

相关问题