2

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);
}

簡単に言えば、標準のシリアライザーをオーバーライドすることは可能ですか、それとも、生成された出力をハックする必要がありますか?

4

1 に答える 1

0

古いバージョンの Jackson を使用しているようです。最初に Jackson2 を試すことをお勧めします。最新版はhttps://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core/2.5.0です。

新しいjsonスキーマモジュールが整数に対して正しいことを行うようです: https://github.com/FasterXML/jackson-module-jsonSchema/blob/master/src/main/java/com/fasterxml/jackson/module/ jsonSchema/types/IntegerSchema.java

于 2015-01-14T17:32:28.437 に答える