java - 设置 Jackson ObjectMapper 类不对 double 使用科学记数法

标签 java jackson jsonschema jackson-modules

我正在为 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 类的情况下获得所需的输出?

提前致谢

最佳答案

我认为这是一个 Java 问题。如果你调试你的程序,你的 Double 将始终科学地显示,所以我们想要的是将它强制转换为 String。这可以在 Java 中以多种方式实现,您可以在这里查看:

How to print double value without scientific notation using Java?

关于你关于 jackson 的具体问题,我已经为你写了一些代码:

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}

希望这能解决您的问题。

阿图尔

关于java - 设置 Jackson ObjectMapper 类不对 double 使用科学记数法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37722152/

相关文章:

java - 如何使用 Java 中的多线程实现 2D 方阵乘法?

java - 如何使用混淆器混淆选择性类?

apache-kafka - Kafka Rest 代理 JSON 模式验证

javascript - JSON 模式中的自定义属性

jsonschema - json-schema,对象数组,唯一键值

java - 如何通过 Clojure 互操作访问静态内部 Java 类?

java - 使用 spring-data-jpa 中的 PagingAndSortingRepository 获取所有记录

java - 转换为 JSON 后保留 XMLGregorianCalendar 日期格式 - Jackson Lib

java - 仅在使用 Jackson 进行序列化或反序列化期间选择性 @JsonIgnore Immutables 访问器方法

java - 使用 Jackson 序列化具有名为 value 的属性的 XML 元素