java - 从java中的pojo生成json模式 - 自定义日期类型

标签 java json jsonschema

我正在使用https://github.com/mbknor/mbknor-jackson-jsonSchema用于生成 json 模式,但是当我的对象包含 LocalDate 时,LocalDate 将如下所示:

   "LocalDate" : {
      "type" : "object",
      "additionalProperties" : false,
      "properties" : {
        "year" : {
          "type" : "integer"
        },
        "month" : {
          "type" : "string",
          "enum" : [ "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER" ]
        },
        "era" : {
          "$ref" : "#/definitions/Era"
        },
        "dayOfYear" : {
          "type" : "integer"
        },
        "dayOfWeek" : {
          "type" : "string",
          "enum" : [ "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY" ]
        },
        "leapYear" : {
          "type" : "boolean"
        },
        "dayOfMonth" : {
          "type" : "integer"
        },
        "monthValue" : {
          "type" : "integer"
        },
        "chronology" : {
          "$ref" : "#/definitions/IsoChronology"
        }
      },
      "required" : [ "year", "dayOfYear", "leapYear", "dayOfMonth", "monthValue" ]
    },
    "Era" : {
      "type" : "object",
      "additionalProperties" : false,
      "properties" : {
        "value" : {
          "type" : "integer"
        }
      },
      "required" : [ "value" ]
    },
    "IsoChronology" : {
      "type" : "object",
      "additionalProperties" : false,
      "properties" : {
        "calendarType" : {
          "type" : "string"
        },
        "id" : {
          "type" : "string"
        }
      }
    }

有人可以帮助我如何将 LocalDate type 更改为字符串,并添加字段format(日期)吗?

我的代码是 groovy 的,因为我正在编写 groovy 插件:

ObjectMapper mapper = new ObjectMapper()
JsonSchemaGenerator jsonSchemaGenerator = new JsonSchemaGenerator(mapper)
JsonNode schema = jsonSchemaGenerator.generateJsonSchema(MyClass.class)

我希望我的 LocalDate 字段如下所示:

    "MyField": {
      "type": "string",
      "format": "date"
    }

感谢您的帮助。

最佳答案

您可以告诉模式生成器您想要在模式中声明某种类型,就好像它们是另一种类型一样。所以你可以说你想将每个 LocalDate 声明为字符串。

为此,您需要创建一个 JsonSchemaConfig 对象并将其传递给 JsonSchemaGenerator 构造函数。

classReMapping 映射中,您可以将类型重新映射到其他类型。

Map<Class<?>, Class<?>> classTypeReMapping = new HashMap<>();
classTypeReMapping.put(LocalDate.class, String.class);

(可选)在 typeToFormatMapping 映射中,您可以将类型映射到 format 注释。您用于 LocalDate 的格式与 JSON 架构规范中定义的 date 格式完全相同:

Map<String, String> typeToFormatMapping = new HashMap<>();
typeToFormatMapping.put(LocalDate.class.getName(), "date");

构建完整的 JsonSchemaConfig:

boolean autoGenerateTitleForProperties = false;
String defaultArrayFormat = null;
boolean useOneOfForOption = true;
boolean useOneOfForNullables = false;
boolean usePropertyOrdering = false;

boolean hidePolymorphismTypeProperty = false;
boolean disableWarnings = false;
boolean useMinLengthForNotNull = false;
boolean useTypeIdForDefinitionName = false;
boolean useMultipleEditorSelectViaProperty = false;
Set<Class<?>> uniqueItemClasses = Collections.emptySet();

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

Map<Class<?>, Class<?>> classTypeReMapping = new HashMap<>();
classTypeReMapping.put(LocalDate.class, String.class);
// #####****##### Add remapped types here 

Map<String, String> typeToFormatMapping = new HashMap<>();
typeToFormatMapping.put(LocalDate.class.getName(), "date");
// #####****##### (optional) Add format annotations for types here 

JsonSchemaConfig config = JsonSchemaConfig.create(
        autoGenerateTitleForProperties,
        Optional.ofNullable(defaultArrayFormat),
        useOneOfForOption,
        useOneOfForNullables,
        usePropertyOrdering,
        hidePolymorphismTypeProperty,
        disableWarnings,
        useMinLengthForNotNull,
        useTypeIdForDefinitionName,
        typeToFormatMapping,
        useMultipleEditorSelectViaProperty,
        uniqueItemClasses,
        classTypeReMapping,
        Collections.emptyMap()
)

构建 JsonSchemaGenerator:

JsonSchemaGenerator jsonSchemaGenerator = new JsonSchemaGenerator(objectMapper, config);
Class<?> mainClassObject = ...;
JsonNode jsonSchema = jsonSchemaGenerator.generateJsonSchema(mainClassObject);

关于java - 从java中的pojo生成json模式 - 自定义日期类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54796877/

相关文章:

java - 查看源代码与 Firebug 检查元素

javascript - 访问从 jQuery 中的 AJAX 对象返回的 JSON

javascript - .NET Core MVC - 带有前缀绑定(bind)的 AJAX POST 请求

json - 如何使用 $ref 文件中的additionalProperties?

c++ - 如何在 Objective-C 中验证 JSON Schema?

java - 使用 spring bean xml 初始化自定义内部对象

java - Weblogic EJB部署: classes in jar inside ear are not accessible

java - 错误 java.lang.ClassNotFoundException

javascript - 将 sessionStorage 放入数组并打印数组中的所有值

arrays - 检查json中的两个数组大小是否相同