gpt4 book ai didi

java - 如何配置 Genson 来反序列化日期?

转载 作者:行者123 更新时间:2023-11-30 05:41:22 26 4
gpt4 key购买 nike

我正在开发一个 Java servlet,我需要将一个类序列化和反序列化为 JSON 并返回。为此,我使用 Genson 库,但遇到了障碍。

Genson 无法反序列化 Date 类 (java.sql.Date) 的实例

我尝试过设置自定义日期格式化程序,但它们似乎不会影响反序列化。

我还尝试使用构建器调用 withConverter() 插入新的转换器,但我无法弄清楚参数是如何工作的。

这是我目前的构建器调用

Genson genson = builder.setSkipNull(true).create();

我正在序列化的类有一个日期类型的字段

private Date introDate;

这是当我尝试反序列化生成的 JSON 时发生的堆栈跟踪片段

Caused by: com.owlike.genson.JsonBindingException: Could not access value of property named 'hours' using accessor public int java.sql.Date.getHours() from class java.sql.Date
at com.owlike.genson.reflect.PropertyAccessor.couldNotAccess(PropertyAccessor.java:40)
at com.owlike.genson.reflect.PropertyAccessor$MethodAccessor.access(PropertyAccessor.java:70)
at com.owlike.genson.reflect.PropertyAccessor.serialize(PropertyAccessor.java:24)
at com.owlike.genson.reflect.BeanDescriptor.serialize(BeanDescriptor.java:92)
at com.owlike.genson.convert.NullConverterFactory$NullConverterWrapper.serialize(NullConverterFactory.java:69)
at com.owlike.genson.reflect.PropertyAccessor.serialize(PropertyAccessor.java:27)
... 38 more

这里的问题是像 getHours() 这样的方法已被弃用,因此调用它们会产生 IllegalArgumentException。我暂时不知道如何解决这个问题。

最佳答案

您可以使用java.util.Date。这适用于 Genson。

如果我们坚持使用 java.sql.Date,那么您可以编写自己的转换器并让 Genson 使用它。

让我们从 ser/deser 的对象开始:

import java.sql.Date;
import lombok.Getter;
import lombok.Setter;

public class CrashTestDummy {
@Getter @Setter private String name;
@Getter @Setter private Date sqlDate;

/** Default no-arg constructor */
public CrashTestDummy() {
}
}

然后我们可以告诉 Genson 使用自定义转换器。在本例中,我将其转换为长纪元时间,然后再转换回来。您可能决定改用特定的日期格式。

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.junit.Test;
import com.owlike.genson.Context;
import com.owlike.genson.Converter;
import com.owlike.genson.Genson;
import com.owlike.genson.GensonBuilder;
import com.owlike.genson.stream.ObjectReader;
import com.owlike.genson.stream.ObjectWriter;

@Test
public void serialiseDate() throws ParseException {
// create a converter for java.sql.Date
Converter<Date> converter = new Converter<Date>() {
@Override
public void serialize(Date obj, ObjectWriter writer, Context ctx) throws Exception {
// java.sql.Date doesn't support any time fields, so we can just focus on y, M and d
if(obj == null) {
writer.writeNull();
return;
}
writer.writeValue( obj.getTime() );
}

@Override
public Date deserialize(ObjectReader reader, Context ctx) {
Long value = reader.valueAsLong();
Date sqlDate = new java.sql.Date( value );
return sqlDate;
}
};

// Build a new Genson object with our converter
Genson genson = new GensonBuilder()
.setSkipNull(true)
.withConverter(converter, java.sql.Date.class)
.create();

// make an important SQL date for testing
java.util.Date utilDate = new SimpleDateFormat("dd MMM yyyy").parse("30 July 1966");
Date sqlDate = new Date(utilDate.getTime() );

// Make something to serialise
CrashTestDummy original = new CrashTestDummy();
original.setName( "Alfa Khrisna" );
original.setSqlDate( sqlDate );

// Call Genson as usual
String json = genson.serialize( original );
System.out.println( json );

// Deserialise as usual; for brevity I'm comparing dates in millis since epoch.
CrashTestDummy clone = genson.deserialize(json, CrashTestDummy.class);
assertEquals(new SimpleDateFormat("dd MMM yyyy").parse("30 July 1966").getTime(), clone.getSqlDate().getTime());
assertEquals("Alfa Khrisna", clone.getName());
}

关于java - 如何配置 Genson 来反序列化日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55559276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com