web-dev-qa-db-ja.com

二重に科学的記数法を使用しないようにJacksonObjectMapperクラスを設定します

JsonSchema用のライブラリcom.fasterxml.jacksonライブラリを使用しています。以下のコードを使用して整数スキーマの範囲を設定すると、IntegerSchemaオブジェクトの作成を作成しています。

main(){
     IntegerSchema intSchema = new IntegerSchema();
     // setMaximum accepts Double object 
     intSchema.setMaximum(new Double(102000000));
     // setMaximum accepts Double object
     intSchema.setMinimum(new Double(100));

     printJsonSchema(intSchema);
}


public void printJsonSchema(JsonSchema schema){
        ObjectMapper mapper = new ObjectMapper();
        try {
            logger.info(mapper.writeValueAsString(schema));
        } catch (JsonProcessingException e) {
            throw new IllegalStateException(e);
        }
}

ObjectMapperを使用してIntegerSchemaを文字列に変換すると、以下の応答が得られます。

{"type":"integer","maximum":1.02E8,"minimum":100.0}

最大値と最小値は科学的記数法に変換されています。

ただし、以下のように非科学的記数法で出力する必要があります。

{"type":"integer","maximum":102000000,"minimum":100}

IntegerSchemaクラスを変更できません。

IntegerSchemaクラスを拡張せずに必要な出力を取得する方法を提案してください。

前もって感謝します

9
Abhij

これはJavaの問題だと思います。プログラムをデバッグすると、Doubleは常に科学的に表示されるので、文字列に強制する必要があります。これは実現できます。 in Javaさまざまな方法で、ここで調べることができます:

Javaを使用して科学的記数法なしでdouble値を出力する方法は?

ジャクソンについてのあなたの特定の質問に関して、私はあなたのためにいくつかのコードを書きました:

public class ObjectMapperTest {

    public static void main(String[] args) throws JsonProcessingException {

        IntegerSchema schema = new IntegerSchema();
        schema.type = "Int";
        schema.max = 10200000000d;
        schema.min = 100d;

        ObjectMapper m = new ObjectMapper();

        System.out.println(m.writeValueAsString(schema));

    }

    public static class IntegerSchema {

        @JsonProperty
        String type;
        @JsonProperty
        double min;
        @JsonProperty
        @JsonSerialize(using=MyDoubleDesirializer.class)
        double max;
    }

    public static class MyDoubleDesirializer extends JsonSerializer<Double> {


        @Override
        public void serialize(Double value, JsonGenerator gen, SerializerProvider serializers)
                throws IOException, JsonProcessingException {
            // TODO Auto-generated method stub

            BigDecimal d = new BigDecimal(value);
            gen.writeNumber(d.toPlainString());
        }

    }

}

秘訣は、Double値のカスタムシリアライザーを登録することです。このように、あなたはあなたが望むものを制御することができます。

私はBigDecimal値を使用して、Doubleの文字列表現を作成しています。次に、出力は次のようになります(特定の例の場合)。

{"type":"Int","min":100.0,"max":10200000000}

それがあなたの問題を解決することを願っています。

Artur

10
pandaadb

Feature.WRITE_BIGDECIMAL_AS_PLAIN これをオブジェクトマッパーに設定します

1
binh phung