2016-10-24 3 views
3

잭슨이 수치 값을 예측할 수없는 임의의 유형으로 역 직렬화하는 데 문제가 있습니다. 예를 들어 누군가 "14"라는 값을 전달하면 jackson은이를 Integer으로 인스턴스화합니다. 그러나 누군가가 값 "14.01"을 전달하면 jackson은 이것을 Double으로 인스턴스화합니다. BigDecimal로 필드를 예측할 수 없으므로 예외를 던지는 사용자 지정 디시리얼라이저 (@JsonCreator)가 있기 때문에 문제가됩니다. 이상적으로 잭슨은 모든 것을 BigDecimal으로 바꿀 것입니다.BigDecimal을 사용하는 스프링 부트 잭슨 디시리얼라이저

나는 Jackson이 이와 같은 일을 할 수 있음을 암시하는 게시물을 발견했습니다. Deserialize JSON into a generic map, forcing all JSON floats into Decimal or String, in Jackson

그러나 적절한 방법 인 mapper.enable()을 실행하기 위해 스프링 부트 안에 숨겨진 매퍼 개체에 액세스하는 방법을 알 수 없습니다. 잭슨은 때때로 두 배에 공급되지 않기 때문에 Double 캐스트가 문제가 있음을,

@JsonCreator 
public OptionTransaction(Map<String,Object> jsonObj){ 
    Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option"); 

    Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price"); 
    BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value")); 

위에서 볼 수 있듯이 : 여기

은 디시리얼라이저의 조각입니다. 누구든지 잭슨에게 항상 BigDecimals 또는 심지어 문자열 만 출력하는 쉬운 방법을 알고 있습니까?

UPDATE : 점점 복식의 BigDecimal로 변환 마찬가지로 지금까지, 나는 다음과 같은 방법으로 application.properties을 수정하여이 작업을 수행

:

# =============================== 
# = DESERIALIZATION CUSTOMIZATION 
# =============================== 
spring.jackson.deserialization.USE_BIG_DECIMAL_FOR_FLOATS=true 
+0

스프링 매퍼에 액세스해야하는 이유는 무엇입니까? –

+0

내 질문에 대한 대답이 포함될 수 있지만 그 질문에 완전히 대답하지는 않습니다. 내 매퍼를 만들려면 스프링 부팅을 사용하여 어떻게 시작합니까? – melchoir55

답변

4
@JsonCreator 
public OptionTransaction(Map<String,Object> jsonObj){ 
    Map<String,Object> jsonOption = (Map<String, Object>) jsonObj.get("option"); 

    Map<String,Object> optionPriceObj = (Map<String, Object>) jsonOption.get("price"); 
    BigDecimal optionValue = new BigDecimal((Double) optionPriceObj.get("value")); 
} 

..

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(DeserializationFeature.USE_BIG_DECIMAL_FOR_FLOATS); 

OptionTransaction transaction = mapper.readValue(jsonString, OptionTransaction.class); 

https://github.com/FasterXML/jackson-databind/wiki/Deserialization-Features

+0

나는이 질문을 미래의 비 직렬화 시도를 위해이 매퍼를 사용하기 시작하는 스핑 부팅을 얻는 방법을 설명해야한다고 대답했다. 그게 가능한가? 예를 들어,'@RequestBody Object obj'를 사용하는 모든 종단점은이 매퍼로 직렬화 해제되어야합니다. – melchoir55