2016-06-09 1 views
4
더블

에 대한 과학적 표기법을 사용하지 :세트 잭슨 ObjectMapper 클래스는 내가 코드 아래 사용하여 정수 스키마에 대한 범위를 설정할 때이 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 클래스를 확장하지 않고 필요한 출력을 얻는 방법을 제안 하시겠습니까?

미리 감사드립니다.

답변

5

이것은 다소 제가 믿는 자바 이슈입니다. 프로그램을 디버깅하면 Double이 과학적으로 항상 표시되므로 우리가 원하는 것은 String으로 강제 변환하는 것입니다. 이것은 여러 가지 방법으로 자바에서 달성 될 수있다, 당신은 여기를 찾아 볼 수 있습니다 :

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

    } 

} 

트릭은 Double 값에 대한 사용자 지정 serializer를 등록하는 것입니다. 이렇게하면 원하는 것을 제어 할 수 있습니다.

BigDecimal 값을 사용하여 Double의 String 표현을 만듭니다. 그러면 출력이 다음과 같이됩니다 (구체적인 예).

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

나는 귀하의 문제를 해결하기를 바랍니다.

Artur

+2

또한 전체 시스템의 모든 복식에 직렬기를 적용하는 모듈을 등록 할 수도 있습니다. 이것이 어떻게 수행되는지에 대한 설명은 http://stackoverflow.com/a/25945058/14731을 참조하십시오. – Gili