【问题标题】:Json Schema Generator with inheritance and references具有继承和引用的 Json 模式生成器
【发布时间】:2019-05-16 18:58:59
【问题描述】:

我正在尝试使用具有深度继承结构的 POJO 生成 JSON 模式。

使用jackson-module-jsonSchema 库我能够生成架构。

给出一个简化的 Java 示例:

public interface I {...}
public class A implements I {
    public int varA;
}
public class B implements I {
    public int varB;
}
public class C {
    public I varC;
}

以下是我生成架构的代码:

import com.fasterxml.jackson.databind.*
import com.fasterxml.jackson.module.jsonSchema.*

// ...

ObjectMapper mapper = new ObjectMapper();

SchemaFactoryWrapper visitor = new SchemaFactoryWrapper();

mapper.acceptJsonFormatVisitor(mapper.constructType(C.class), visitor);

JsonSchema schema = visitor.finalSchema();

String outputSchemaJson = mapper.writerWithDefaultPrettyPrinter()
                                .writeValueAsString(schema);

实际的 Json 架构:

{
  "type" : "object",
  "id" : "urn:jsonschema:com:mycompany:GenerateSchemas:C",
  "properties" : {
    "varC" : {
      "type" : "any"
    }
  }
}

所需的 Json 架构:

{
  "definitions": {
    "A": {
        "type" : "object",
        "id" : "urn:jsonschema:com:mycompany:GenerateSchemas:A",
        "properties" : {
          "varA" : {
            "type" : "integer"
          }
        }
      },
    "B": {
        "type" : "object",
        "id" : "urn:jsonschema:com:mycompany:GenerateSchemas:B",
        "properties" : {
          "varB" : {
            "type" : "integer"
          }
        }
      }
  },
  "type" : "object",
  "id" : "urn:jsonschema:com:mycompany:GenerateSchemas:C",
  "properties" : {
    "varC" : {
      "type" : "object",
      "oneOf": [
        { "$ref": "urn:jsonschema:com:mycompany:GenerateSchemas:A" },
        { "$ref": "urn:jsonschema:com:mycompany:GenerateSchemas:B" }
      ]
    }
  }
}

我尝试过覆盖 Json Schema 库中的核心类。 This 来自堆栈溢出的答案有助于生成带有引用的架构。

现在我试图了解我需要重写什么,以便我可以使用反射来获取接口的所有继承类并添加 oneOf 对其的引用。

【问题讨论】:

    标签: java json jackson jsonschema


    【解决方案1】:

    我终于能够弄清楚我需要重写哪些类。

    注意事项:

    • Java 不支持通过简单的开箱即用 api 通过反射动态查找子类。一种解决方法是用 @JsonSubType 注释类,我能够在运行时提取它。

    • 在 json-module-schema 库的 2.9.8 版(其中编写了解决方案的修订版 1)中,尚不支持对象定义。为了完成工作,我不得不重写 a few extra classes 以使这成为可能。

    • definitions 只需在 json 架构中在根级别定义一次,因为可能存在递归引用的情况。


    使用更新的 POJO 代码:

    @JsonSubTypes({
        @JsonSubTypes.Type(name = "A", value = A.class),
        @JsonSubTypes.Type(name = "B", value = B.class)
    })
    public interface I {}
    
    public class A implements I {
        public int varA;
    }
    public class B implements I {
        public int varB;
    }
    public class C {
        public I varC;
    }
    

    成功生成所需的 json 架构输出。

    给定以下代码:https://gist.github.com/rrmistry/2246c959d1c9cc45894ecf55305c61fd,我导入了GenerateSchema 类以使架构生成代码更加简化:

    public void generate() throws Exception {
        generateSchemasFromJavaSubTypes(C.class);
    }
    
    private void generateSchemasFromJavaSubTypes(Class<?> classToGenerate) throws Exception {
    
        JsonSchema schema = GenerateSchemas.generateSchemaFromJavaClass(classToGenerate);
    
        ObjectMapper mapper = new ObjectMapper();
    
        String jsonSchemaStr = mapper.writerWithDefaultPrettyPrinter()
                                     .writeValueAsString(schema);
    }
    

    已创建 GitHub 问题以请求本机支持:https://github.com/FasterXML/jackson-module-jsonSchema/issues/135

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-07
      • 2014-01-31
      • 2015-02-09
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      相关资源
      最近更新 更多