2015-01-14 5 views
2

Jackson은 기본값으로 WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS (READ_)을 사용하는 java.time.Instant를 작동시킵니다. jackson-datatype-jsr310Jackson Java 8 DateTime serialization

는 그것은 new Date(1421261297356)처럼 (안 초/나노에서 위와 같이) 전통 밀리 타임 스탬프에서 날짜를 얻기 위해 훨씬 쉽게 자바 스크립트에서이

{ "createDate":1421261297.356000000, "modifyDate":1421261297.356000000 }

같은 JSON을 생산하고 있습니다.

기본적으로 나노 접근 방식을 사용해야하는 이유가 있어야한다고 생각합니다. 그 이유는 무엇입니까?

+0

이유는 잭슨이 인스턴트가 가지고있는 정밀도를 잃지 않도록 시도 할 아마도. 수신기가 JavaScript가 아닐 수도 있습니다. –

+0

네, 아마도 당신 말이 맞을 겁니다. 그러나 nonos는 실제로 여기 0입니다. 아마 이것은 Java 8 java.time에 더 있습니다. –

답변

3

한 가지 방법은 나만의 Jackson 모듈을 만들고 필요한 직렬화를 수행하는 것입니다.

Jackson SimpleModule을 확장하고 람다 친화적 인 몇 가지 방법을 제공하는 간단한 Jackson8Module을 수행 할 수도 있습니다. 나는 일정 또는 날짜가 여전히 밀리 초 단위로 직렬화와 같은 JSR310Module 클래스를 사용하기 때문에,이 이상을 발견

Is there a way to use Java 8 lambda style to add custom Jackson serializer?

4

: 여기

ObjectMapper jacksonMapper = new ObjectMapper(); 
Jackson8Module module = new Jackson8Module(); 
module.addStringSerializer(LocalDate.class, (val) -> val.toString()); 
module.addStringSerializer(LocalDateTime.class, (val) -> val.toString()); 
jacksonMapper.registerModule(module); 

은 Jackson8Module 코드입니다. 그것은 논리적이지 않습니다. 그들이이 언급 한 JSR310Module 문서에서

(https://github.com/FasterXML/jackson-datatype-jsr310) : 직렬화

는, 타임 스탬프는 수 초 분수 (소수)로 작성하고 소수는 경우, 소수 초 WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS (디폴트에서는), 기본이되는 JDK의 구현에 응한 나노초만큼의 정밀도로 해결됩니다. WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS가 비활성화되면 타임 스탬프는 밀리 초 단위로 기록됩니다.

그래서, 당신이 그들이 말하는처럼 매퍼를 구성이다 달성하기 원하는에 대한 간단한 솔루션 :

mapper.configure(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS, false); 
    mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, true);