Джексон удаляет & ldquo; e & rdquo; из BigDecimal [дубликат]

Вот как я это делаю:

str(1).zfill(len(str(total)))

В основном zfill занимает число ведущих нулей, которые вы хотите добавить, поэтому легко взять самое большое число, превратить его в строку и получить длина, например:

Python 3.6.5 (default, May 11 2018, 04:00:52) 
[GCC 8.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> total = 100
>>> print(str(1).zfill(len(str(total))))
001
>>> total = 1000
>>> print(str(1).zfill(len(str(total))))
0001
>>> total = 10000
>>> print(str(1).zfill(len(str(total))))
00001
>>> 
4
задан Abhij 9 June 2016 в 09:36
поделиться

2 ответа

Feature.WRITE_BIGDECIMAL_AS_PLAIN установить это для вашего объекта Mapper

0
ответ дан binh phung 27 August 2018 в 09:55
поделиться

Я думаю, что это проблема Java. Если вы отлаживаете свою программу, ваш Double будет всегда отображаться с научной точки зрения, поэтому мы хотим, чтобы он был в String. Это может быть достигнуто на Java несколькими способами, и вы можете найти его здесь:

Как печатать двойное значение без научной нотации с использованием 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());
        }

    }

}

Трюк заключается в регистрации пользовательского Serializer для вашего двойного значения. Таким образом, вы можете контролировать то, что хотите.

Я использую значение BigDecimal для создания строкового представления вашего Double. Затем выход будет (для конкретного примера):

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

Надеюсь, что это решает вашу проблему.

Artur

6
ответ дан Community 27 August 2018 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: