org.codehaus.jackson.map.ObjectMapper
(databind バージョンではありません!) を使用して、次のオブジェクトから json スキーマを生成しています。
public class MyModelObject {
private long fileSize;
//... other properties, getters, setters etc
}
次のコードを使用します。
ObjectMapper mapper = new ObjectMapper();
JsonSchema schema = mapper.generateJsonSchema(clazz);
String jsonString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(schema);
次のスキーマを取得します (関連する部分に取り除かれます)。
{
"type" : "object",
"properties" : {
"fileSize" : {
"type" : "number"
}
}
}
「number」は long の最適な表現ではありません。別の場所でスキーマから pojo を生成しようとすると、「long」ではなく「double」が得られるためです (または「int」でも問題ありません)。
これによると、私のニーズにはるかに適したjsonの「整数」データ型があります: http://spacetelescope.github.io/understanding-json-schema/reference/numeric.html
しかし、jackson-mapper モジュールのソース コードを調べたところLongSerializer
、このクラスに含まれる標準シリアライザーが使用されていることがわかりました。org.codehaus.jackson.map.ser.StdSerializers
関連する部分は次のメソッドです。
@Override
public JsonNode getSchema(SerializerProvider provider, Type typeHint)
{
return createSchemaNode("number", true);
}
簡単に言えば、標準のシリアライザーをオーバーライドすることは可能ですか、それとも、生成された出力をハックする必要がありますか?