2016-06-09 2 views
4

Я использую библиотеку библиотеки com.fasterxml.jackson для JsonSchema, Я создаю создание объекта IntegerSchema, когда я установил диапазон для целочисленнога схемы с использованием коды ниже:набора Джексон ObjectMapper класс не использовать научные обозначения для двойного

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); 
     } 
} 

Когда я конвертировать IntegerSchema в строку, используя ObjectMapper получения ниже ответ:

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

максимальные и минимальные значения становятся преобразованы в научной нотации.

Но мне нужно вывод в научной нотации, не ниже:

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

Я не могу изменить класс IntegerSchema.

Просьба предложить, как получить требуемый результат без расширения класса IntegerSchema?

Заранее спасибо

ответ

5

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

How to print double value without scientific notation using 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()); 
     } 

    } 

} 

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

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

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

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

Artur

+2

Вы также можете зарегистрировать модуль для применения сериализатора ко всем удвоениям по всей системе. См. Http://stackoverflow.com/a/25945058/14731 для объяснения того, как это делается. – Gili

Смежные вопросы