Joda Date Time을 Jackson JSON 프로세서로 시리얼화하는 방법
Jackson이 Joda DateTime 개체를 간단한 패턴(예: "dd-MM-yyy")에 따라 직렬화하려면 어떻게 해야 합니까?
시도했습니다.
@JsonSerialize(using=DateTimeSerializer.class)
private final DateTime date;
또, 다음과 같이 했습니다.
ObjectMapper mapper = new ObjectMapper()
.getSerializationConfig()
.setDateFormat(df);
감사합니다!
이것은 Jackson 2.0과 Joda 모듈로 매우 쉬워졌습니다.
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
Maven 의존관계:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.1.1</version>
</dependency>
코드 및 문서: https://github.com/FasterXML/jackson-datatype-joda
바이너리: http://repo1.maven.org/maven2/com/fasterxml/jackson/datatype/jackson-datatype-joda/
매핑할 개체:
@JsonSerialize(using = CustomDateSerializer.class)
public DateTime getDate() { ... }
CustomDateSerializer에서:
public class CustomDateSerializer extends JsonSerializer<DateTime> {
private static DateTimeFormatter formatter =
DateTimeFormat.forPattern("dd-MM-yyyy");
@Override
public void serialize(DateTime value, JsonGenerator gen,
SerializerProvider arg2)
throws IOException, JsonProcessingException {
gen.writeString(formatter.print(value));
}
}
@Kimble이 말했듯이 Jackson 2에서는 기본 포맷을 사용하는 것이 매우 간단합니다.등록만 하면 됩니다.JodaModule
에ObjectMapper
.
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
커스텀 시리얼화/디시리얼화DateTime
, 독자적인 실장이 필요합니다.StdScalarSerializer
그리고.StdScalarDeserializer
꽤 복잡하긴 하지만 어쨌든.
예를 들면, 여기DateTime
를 사용하는 시리얼라이저ISODateFormat
UTC 타임존을 설정합니다.
public class DateTimeSerializer extends StdScalarSerializer<DateTime> {
public DateTimeSerializer() {
super(DateTime.class);
}
@Override
public void serialize(DateTime dateTime,
JsonGenerator jsonGenerator,
SerializerProvider provider) throws IOException, JsonGenerationException {
String dateTimeAsString = ISODateTimeFormat.withZoneUTC().print(dateTime);
jsonGenerator.writeString(dateTimeAsString);
}
}
대응하는 디시리얼라이저:
public class DateTimeDesrializer extends StdScalarDeserializer<DateTime> {
public DateTimeDesrializer() {
super(DateTime.class);
}
@Override
public DateTime deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
try {
JsonToken currentToken = jsonParser.getCurrentToken();
if (currentToken == JsonToken.VALUE_STRING) {
String dateTimeAsString = jsonParser.getText().trim();
return ISODateTimeFormat.withZoneUTC().parseDateTime(dateTimeAsString);
}
} finally {
throw deserializationContext.mappingException(getValueClass());
}
}
그런 다음 모듈을 사용하여 이들을 묶습니다.
public class DateTimeModule extends SimpleModule {
public DateTimeModule() {
super();
addSerializer(DateTime.class, new DateTimeSerializer());
addDeserializer(DateTime.class, new DateTimeDeserializer());
}
}
그런 다음 모듈을 에 등록합니다.ObjectMapper
:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new DateTimeModule());
간단한 솔루션
저는 비슷한 문제를 겪었고, 제 해결책은 위보다 훨씬 명확합니다.
나는 단지 패턴을 사용했을 뿐이다. @JsonFormat
주석
기본적으로 우리 반에는DateTime
필드, 그래서 게터 주위에 주석을 달았습니다.
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
public DateTime getDate() {
return date;
}
나는 반을 연재한다.ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
ObjectWriter ow = mapper.writer();
try {
String logStr = ow.writeValueAsString(log);
outLogger.info(logStr);
} catch (IOException e) {
logger.warn("JSON mapping exception", e);
}
잭슨 2.5.4를 사용합니다.
https://stackoverflow.com/a/10835114/1113510
각 날짜 필드에 주석을 추가할 수 있지만, 개체 매퍼에 대한 글로벌 구성을 수행하는 것이 좋습니다.Jackson을 사용하는 경우 스프링을 다음과 같이 구성할 수 있습니다.
<bean id="jacksonObjectMapper" class="com.company.CustomObjectMapper" />
<bean id="jacksonSerializationConfig" class="org.codehaus.jackson.map.SerializationConfig"
factory-bean="jacksonObjectMapper" factory-method="getSerializationConfig" >
</bean>
Custom Object Mapper의 경우:
public class CustomObjectMapper extends ObjectMapper {
public CustomObjectMapper() {
super();
configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false);
setDateFormat(new SimpleDateFormat("EEE MMM dd yyyy HH:mm:ss 'GMT'ZZZ (z)"));
}
}
물론 SimpleDateFormat은 필요한 모든 형식을 사용할 수 있습니다.
한편 Jackson은 Joda Module이 클래스 패스에 있을 때 Joda 모듈을 자동으로 등록합니다.방금 메이븐에 잭슨 데이터 타입 조다를 추가했는데 바로 작동했어요.
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.8.7</version>
</dependency>
JSON 출력:
{"created" : "2017-03-28T05:59:27.258Z"}
Spring Boot을 사용하는 사용자의 경우 모듈을 컨텍스트에 추가해야 합니다.이렇게 모듈이 설정에 추가됩니다.
@Bean
public Module jodaTimeModule() {
return new JodaModule();
}
새로운 java8 타임모듈 jsr-310을 사용하는 경우
@Bean
public Module jodaTimeModule() {
return new JavaTimeModule();
}
Jackson 1.9.12의 경우 기본적으로는 다음과 같은 이유로 이러한 가능성이 없는 것으로 보입니다.
public final static class DateTimeSerializer
extends JodaSerializer<DateTime>
{
public DateTimeSerializer() { super(DateTime.class); }
@Override
public void serialize(DateTime value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonGenerationException
{
if (provider.isEnabled(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS)) {
jgen.writeNumber(value.getMillis());
} else {
jgen.writeString(value.toString());
}
}
@Override
public JsonNode getSchema(SerializerProvider provider, java.lang.reflect.Type typeHint)
{
return createSchemaNode(provider.isEnabled(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS)
? "number" : "string", true);
}
}
이 클래스는 Joda Date Time의 toString() 메서드를 사용하여 데이터를 시리얼화합니다.
Rusty Kuntz가 제안한 접근법은 제 경우에 딱 맞습니다.
저는 자바8을 쓰고 있는데 이게 효과가 있었어요.
.pom.xml
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.4.0</version>
</dependency>
을 Joda Module에 합니다.ObjectMapper
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JodaModule());
빌트인 Joda 시리얼라이저/디시리얼라이저를 사용하여 쉽게 구성 가능
커스텀 포맷을 원하는 경우 커스텀시리얼라이저나 디세리얼라이저를 쓸 필요가 없습니다. jackson-datatype-joda
2.는 2.x420을 합니다.DateTimeSerializer
★★★★★★★★★★★★★★★★★」DateTimeDeserializer
를 사용하여 커스텀 포맷을 제공할 수 있습니다.다음으로 설정된 시리얼라이저 및/또는 디시리얼라이저를JodaModule
모듈을 추가할 때 사용합니다.
된 Serializer를 의 Serializer/Deserializer(Deserializer(Deserializer(Deserializer(Deserializer(Deserializer(Deserializer))에 주석을 달 수 .DateTime
( 「」)@JsonFormat(pattern = ". . .")
설정한 형식을 덮어씁니다.1.에, 「Jackson 1.x days」(Jackson 1.x days)에 준거하지 .@JsonFormat
그 홀수공이 그 홀수공이 하나 있다.DateTime
다음 예시와 같이 다른 형식이 필요한 값을 쉽게 처리할 수 있습니다.
「 」에 해, 「 」에 가세해DateTimeSerializer
★★★★★★★★★★★★★★★★★」DateTimeDeserializer
에도 '하다, 하다, 하다, 하다'와 같은 것들이 있습니다LocalDateSerializer
/LocalDateDeserializer
,PeriodSerializer
/PeriodDeserializer
등등.
예
Java와 Kotlin의 예를 다음에 나타냅니다.의존관계에 다음 항목을 추가해야 합니다.
com.fasterxml.jackson.datatype:jackson-datatype-joda:{version}
포맷을 하고, 를 통해 로 그 을 덮어씁니다.@JsonFormat
석입니니다다
Java의 예시
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.datatype.joda.JodaModule;
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat;
import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer;
import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer;
import org.joda.time.DateTime;
import org.joda.time.ReadableInstant;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class JacksonJodaTimeJavaExample
{
private static final DateTimeFormatter DATE_TIME_FORMATTER =
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ");
private static final JacksonJodaDateFormat JACKSON_JODA_DATE_FORMAT =
new JacksonJodaDateFormat(DATE_TIME_FORMATTER);
private static ObjectMapper mapper = createMapper();
private static ObjectMapper createMapper()
{
return JsonMapper
.builder()
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.addModule(new JodaModule()
// If you do not want to customize the formatting, you can remove the next two lines
.addSerializer(new DateTimeSerializer(JACKSON_JODA_DATE_FORMAT))
.addDeserializer(ReadableInstant.class, new DateTimeDeserializer(ReadableInstant.class, JACKSON_JODA_DATE_FORMAT))
)
// Enable pretty printing for our example
.enable(SerializationFeature.INDENT_OUTPUT)
.build();
}
record Event(
DateTime startTime,
DateTime endTime,
@JsonFormat(pattern = "yyyy-MM-dd 'at' HH:mm:ss")
DateTime dateTimeInAlternateFormat
) {}
public static void main(String[] args) throws Exception
{
final DateTime now = DateTime.now();
Event event = new Event(now, now.plusHours(1), now);
String json = mapper.writeValueAsString(event);
System.out.println(json);
Event deserializedEvent = mapper.readValue(json, Event.class);
System.out.println(deserializedEvent);
}
}
Kotlin의 예
import com.fasterxml.jackson.annotation.JsonFormat
import com.fasterxml.jackson.databind.SerializationFeature
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.datatype.joda.JodaModule
import com.fasterxml.jackson.datatype.joda.cfg.JacksonJodaDateFormat
import com.fasterxml.jackson.datatype.joda.deser.DateTimeDeserializer
import com.fasterxml.jackson.datatype.joda.ser.DateTimeSerializer
import org.joda.time.DateTime
import org.joda.time.ReadableInstant
import org.joda.time.format.DateTimeFormat
object JacksonJodaTimeKotlinExample
{
private val DATE_TIME_FORMATTER = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZZ")
private val JACKSON_JODA_DATE_FORMAT = JacksonJodaDateFormat(DATE_TIME_FORMATTER)
private val mapper = createMapper()
private fun createMapper() =
JsonMapper
.builder()
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
.addModule(
// If you do not want to customize the formatting, you can remove the "apply" block
JodaModule().apply {
addSerializer(DateTimeSerializer(JACKSON_JODA_DATE_FORMAT))
addDeserializer(ReadableInstant::class.java, DateTimeDeserializer(ReadableInstant::class.java, JACKSON_JODA_DATE_FORMAT))
})
// Enable pretty printing for our example
.enable(SerializationFeature.INDENT_OUTPUT)
.build()
data class Event(
var startTime: DateTime? = null,
var endTime: DateTime? = null,
// If we want a DateTime in an alternate format, we can
@JsonFormat(pattern = "yyyy-MM-dd 'at' HH:mm:ss")
var dateTimeInAlternateFormat: DateTime? = null)
fun runExample()
{
val now = DateTime.now()
val event = Event(now, now.plusHours(1), now)
val json = mapper.writeValueAsString(event)
println(json)
val deserializedEvent = mapper.readValue(json, Event::class.java)
println(deserializedEvent)
}
}
fun main()
{
JacksonJodaTimeKotlinExample.runExample()
}
언급URL : https://stackoverflow.com/questions/3269459/how-to-serialize-joda-datetime-with-jackson-json-processor
'programing' 카테고리의 다른 글
자바에도 스톱워치가 있나요? (0) | 2022.12.01 |
---|---|
브라우저 session스토리지탭 간에 공유하시겠습니까? (0) | 2022.12.01 |
Python의 사전에 새 항목 추가 (0) | 2022.12.01 |
display()가 C의 링크 리스트를 사용하여 큐에 세그멘테이션에러를 발생시키는 이유 (0) | 2022.12.01 |
SQL Attendance 데이터베이스 설계 (0) | 2022.11.22 |