Генерация JSON-схемы из Pojo в Java - пользовательский тип даты - PullRequest
0 голосов
/ 21 февраля 2019

Я использую 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 введите в строку, а также добавьте поле формат , который будет датой?

Мой код не работает, так как я пишу плагин Groovy:

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

Iхочу, чтобы мое поле LocalDate выглядело так:

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

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Вы можете указать генератору схемы, что вы хотите объявить некоторый тип в схеме, как если бы это был другой тип.Таким образом, вы можете сказать, что хотите объявить каждый LocalDate как String.

Для этого вам нужно создать объект JsonSchemaConfig и передать его конструктору JsonSchemaGenerator.

ВclassReMapping сопоставление, вы можете переназначать типы на другие типы.

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

При желании в сопоставлении typeToFormatMapping можно сопоставить типы с аннотациями format.Формат, который вы используете для LocalDate, в точности соответствует формату date, как определено в спецификации схемы JSON:

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);
0 голосов
/ 21 февраля 2019

Вы можете настроить сериализатор клиента и сериализовать LocalDate внутри этого сериализатора.Например (я скопировал фрагмент из их файла readme для github);

@JsonSerialize(using = MySpecialSerializer.class)
@JsonSchemaInject( json = "{\"//your schema here\"}" )
public class MyPojo {
  private LocalDate localDate;

  public LocalDate getLocalDate() {
    return localDate;
  }
  //and the rest the class
}
    public class MySpecialSerializer extends JsonSerializer<MyPojo>
    {

        @Override
        public void serialize(final MyPojo myPojo, 
                              final JsonGenerator gen, 
                              final SerializerProvider serializers) 
        throws IOException 
        {
           gen.writeObject(localDate.format(DateTimeFormatter.ISO_DATE));
           //and the other field serialization
        }

    }

Вы также можете использовать модуль даты Джексона java-8, если требуется.

...