잭슨이 수치 값을 예측할 수없는 임의의 유형으로 역 직렬화하는 데 문제가 있습니다. 예를 들어 누군가 "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
스프링 매퍼에 액세스해야하는 이유는 무엇입니까? –
내 질문에 대한 대답이 포함될 수 있지만 그 질문에 완전히 대답하지는 않습니다. 내 매퍼를 만들려면 스프링 부팅을 사용하여 어떻게 시작합니까? – melchoir55