2016-09-13 9 views
0

Jackson JSONスキーマモジュールバージョン2.7.4を使用して、一部のクラスのJSONスキーマを生成しています。私のクラスでは、Joda DateTimeオブジェクトを使用しました。このオブジェクトのスキーマは、すべてのプロパティを展開して生成されます(下図参照)。これをDATE_TIMEのようなものに変換することは可能ですか?Jackson JSONの日付用スキーマジェネレータ

"createdDate":{ 
    "type":"object", 
    "id":"urn:jsonschema:org:joda:time:DateTime", 
    "properties":{ 
     "weekOfWeekyear":{ 
      "type":"integer" 
     }, 
     "weekyear":{ 
      "type":"integer" 
     }, 
     "yearOfEra":{ 
      "type":"integer" 
     }, 
     "secondOfDay":{ 
      "type":"integer" 
     }, 
     "minuteOfDay":{ 
      "type":"integer" 
     }, 
     "yearOfCentury":{ 
      "type":"integer" 
     }, 
     "centuryOfEra":{ 
      "type":"integer" 
     }, 
     "millisOfDay":{ 
      "type":"integer" 
     }, 
     "monthOfYear":{ 
      "type":"integer" 
     }, 
     "hourOfDay":{ 
      "type":"integer" 
     }, 
     "minuteOfHour":{ 
      "type":"integer" 
     }, 
     "secondOfMinute":{ 
      "type":"integer" 
     }, 
     "millisOfSecond":{ 
      "type":"integer" 
     }, 
     "year":{ 
      "type":"integer" 
     }, 
     "dayOfMonth":{ 
      "type":"integer" 
     }, 
     "dayOfWeek":{ 
      "type":"integer" 
     }, 
     "era":{ 
      "type":"integer" 
     }, 
     "dayOfYear":{ 
      "type":"integer" 
     }, 
     "chronology":{ 
      "type":"object", 
      "id":"urn:jsonschema:org:joda:time:Chronology", 
      "properties":{ 
       "zone":{ 
       "type":"object", 
       "id":"urn:jsonschema:org:joda:time:DateTimeZone", 
       "properties":{ 
        "id":{ 
         "type":"string" 
        }, 
        "fixed":{ 
         "type":"boolean" 
        } 
       } 
       } 
      } 
     }, 
     "zone":{ 
      "type":"object", 
      "$ref":"urn:jsonschema:org:joda:time:DateTimeZone" 
     }, 
     "millis":{ 
      "type":"integer" 
     }, 
     "afterNow":{ 
      "type":"boolean" 
     }, 
     "beforeNow":{ 
      "type":"boolean" 
     }, 
     "equalNow":{ 
      "type":"boolean" 
     } 
    } 
    }, 

答えて

0

これは適切な解決策であるかどうかわかりませんが、これは別のWebサイトで提案されたものです。したがって、私は答えとしてこれを掲示しています。

ジャクソンスキーマモジュールには、VisitorContextという概念があり、スキーマ生成のためにObjectMapperクラスに登録できます。提案ごとに、私はこのの実装を提供されるように:私は私のスキーマがcreatedDate

のためにこれを持って見ることができました。これにより

final ObjectMapper mapper = new ObjectMapper(); 
final ObjectWriter objectWriter = mapper.writer(); 

final SchemaFactoryWrapper visitor = new SchemaFactoryWrapper(); 
visitor.setVisitorContext(new VisitorContextWithoutSchemaInlining()); 

objectWriter.acceptJsonFormatVisitor(candidateClass, visitor); 
final JsonSchema jsonSchema = visitor.finalSchema(); 
final String schemaJsonString = objectWriter.forType(JsonSchema.class).writeValueAsString(jsonSchema); 

ObjectMapperでこれを使用するには

public static class VisitorContextWithoutSchemaInlining extends VisitorContext { 
    @Override 
    public String addSeenSchemaUri(final JavaType aSeenSchema) { 
    return getSeenSchemaUri(aSeenSchema); 
    } 

    @Override 
    public String getSeenSchemaUri(final JavaType aSeenSchema) { 
    return isEligibleForInlineSchema(aSeenSchema) ? javaTypeToUrn(aSeenSchema) : null; 
    } 

    private boolean isEligibleForInlineSchema(final JavaType type) { 
    return type.getRawClass() != String.class 
       && !isBoxedPrimitive(type) 
       && !type.isPrimitive() 
       && !type.isMapLikeType() 
       && !type.isCollectionLikeType() 
       && type.getRawClass() == DateTime.class 
       ; 
    } 

    private boolean isBoxedPrimitive(final JavaType type) { 
     return type.getRawClass() == Boolean.class 
      || type.getRawClass() == Byte.class 
      || type.getRawClass() == Long.class 
      || type.getRawClass() == Integer.class 
      || type.getRawClass() == Short.class 
      || type.getRawClass() == Float.class 
      || type.getRawClass() == Double.class 
      ; 
    } 
} 

、私はこれをしませんでした

"createdDate":{"type":"object","$ref":"urn:jsonschema:org:joda:time:DateTime"} 
0

このモジュールにサポートやJodaがあるかどうかはわかりません。 あなたができることは、生成されたJodaスキーマを自分で置き換えることです。

private void replaceDateTime(JsonSchema schema, Class<?> clazz) { 
     Field[] fields = ClazzFieldFinder.getAllFields(clazz); 
     for (Field field : fields) { 
      String fieldName = field.getName(); 
      if (field.getType().equals(DateTime.class)) { 
       schema.asObjectSchema().getProperties().remove(fieldName); 

       StringSchema stringSchemaDateTime = new StringSchema(); 
       stringSchemaDateTime.setFormat(JsonValueFormat.DATE_TIME); 
       schema.asObjectSchema().getProperties().put(fieldName, stringSchemaDateTime); 
      } 
     } 
    } 

Jodaの生成されたスキーマを削除し、文字列/ date_time形式を追加します。

関連する問題