20

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

提前致谢

4

5 回答 5

19

我相信这是一个java问题。如果你调试你的程序,你的 Double 总是会科学地显示,所以我们想要的是强制它变成一个字符串。这可以通过多种方式在 Java 中实现,您可以在此处查找:

如何使用 Java 在没有科学计数法的情况下打印双精度值?

关于您关于杰克逊的具体问题,我为您编写了一些代码:

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}

我希望这能解决你的问题。

阿图尔

于 2016-06-09T10:17:09.330 回答
13

Feature.WRITE_BIGDECIMAL_AS_PLAIN 为你的对象映射器设置这个

于 2018-06-13T05:14:08.903 回答
8

我知道我回答迟了,但我面临的一些事情可能会帮助其他人

在转换我在下面遇到的 BigDecimal 时正在工作

mapper = mapper.setNodeFactory(JsonNodeFactory.withExactBigDecimals(true));

虽然这对我不起作用

mapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);
于 2020-12-25T08:37:48.397 回答
5

更新 Jakson 2.9.10

属性WRITE_BIGDECIMAL_AS_PLAIN替换为com.fasterxml.jackson.core.JsonGenerator。你可以使用:

mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);
于 2021-02-18T08:14:22.437 回答
1

如果您使用 ValueToTree,则不需要任何出厂设置。ValueToTree 的唯一问题是它正在转换为 TextNode(String Fromat),因此如果您有任何基于 ObjectNodes 的逻辑,它将无法正常工作

于 2021-01-22T21:51:54.837 回答