Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将Jackson ObjectMapper类设置为不使用双精度的科学符号_Java_Jackson_Jsonschema_Jackson Modules - Fatal编程技术网

Java 将Jackson ObjectMapper类设置为不使用双精度的科学符号

Java 将Jackson ObjectMapper类设置为不使用双精度的科学符号,java,jackson,jsonschema,jackson-modules,Java,Jackson,Jsonschema,Jackson Modules,我正在使用JsonSchema的com.fasterxml.jackson库, 当我使用以下代码设置整数模式的范围时,我正在创建IntegerSchema对象: main(){ IntegerSchema intSchema = new IntegerSchema(); // setMaximum accepts Double object intSchema.setMaximum(new Double(102000000)); // setMaximu

我正在使用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将总是科学地显示出来,所以我们想要的是把它强制成一个字符串。这可以通过多种方式在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());
        }

    }

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

艺术


为您的对象映射器设置此选项

我知道我回答晚了,但我面临的一些问题可能会帮助其他人

当转换一个大的十进制数时,我在下面遇到的是工作

mapper = mapper.setNodeFactory(JsonNodeFactory.withExactBigDecimals(true));
虽然这对我不起作用

mapper.configure(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN, true);

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

属性
WRITE\u BIGDECIMAL\u AS\u PLAIN
替换为
com.fasterxml.jackson.core.jsonggenerator
。您可以使用:

mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);

您还可以注册一个模块,将序列化程序应用于整个系统中的所有双精度。请参阅,以了解如何执行此操作的说明。BigDecimal返回非常长的十进制大小,如:10200000000.00001237234,您可以使用此值对用户4 decimal:gen.writeNumber(BigDecimal.setScale(4,RoundingMode.天花板).toPlainString());如下所示:mapper.configure(Feature.WRITE\u BIGDECIMAL\u AS\u PLAIN,true);顾名思义,这只适用于BigDecimal。它不适用于Double。虽然它可以为所有的数字,而不仅仅是双倍!我不明白原因,但这也是我的解决方案。在我的例子中,
WRITE_BIGDECIMAL_AS_PLAIN
WRITE_NUMBERS_AS_STRINGS
都不起作用,但使用ExactBigdecimals设置节点工厂起作用。我正在使用jackson2.11执行序列化:
myJsonMapper.valueToTree(myPojo)
。这是一个很好的更新。
mapper.enable(JsonGenerator.Feature.WRITE_BIGDECIMAL_AS_PLAIN);