android - 使用带有改造的android反序列化日期时间字符串
问题描述
我正在尝试使用改造和在 kotlin 中定义的模型来反序列化 JSON。但是我无法让它工作。我不断收到无法序列化的错误。
{
"Id": 144007,
"StartTime": "2020-05-14T16:38:30.753",
}
data class PickJobModel (
@SerializedName("Id") val id: Int,
@SerializedName("StartTime") val startTime: Date?
)
问候,
卫斯理。
解决方案
此解决方案是动态的,因此您可以在GsonUtils
课堂上注册任意数量的TypeAdapter。
为此,您必须customGsonConverterFactory
像这样创建自己的类:
public class CustomGsonConverterFactory extends Converter.Factory {
private final Gson gson;
private CustomGsonConverterFactory(Gson gson) {
this.gson = gson;
}
public static CustomGsonConverterFactory create(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
return new CustomGsonConverterFactory(gson);
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new GsonResponseBodyConverter<>(gson, adapter);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new GsonRequestBodyConverter<>(gson, adapter);
}
}
Kotlin 等效的 CustomGsonConverterFactory 类
class CustomGsonConverterFactory private constructor(private val gson: Gson) : Converter.Factory() {
fun responseBodyConverter(
type: Type,
annotations: Array<Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *> {
val adapter = gson.getAdapter<*>(TypeToken.get(type))
return GsonResponseBodyConverter(gson, adapter)
}
fun requestBodyConverter(
type: Type,
parameterAnnotations: Array<Annotation>,
methodAnnotations: Array<Annotation>,
retrofit: Retrofit
): Converter<*, RequestBody> {
val adapter = gson.getAdapter<*>(TypeToken.get(type))
return GsonRequestBodyConverter(gson, adapter)
}
companion object {
fun create(gson: Gson?): CustomGsonConverterFactory {
if (gson == null) throw NullPointerException("gson == null")
return CustomGsonConverterFactory(gson)
}
}
}
创建GsonUtils
类,您可以在其中注册自定义适配器,如下所示:
public class GsonUtils {
private static final Gson sGSON = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateDeserializer())
.create();
public static Gson getGson() {
return sGSON;
}
}
Kotlin 等效的 GsonUtils 类
object GsonUtils {
val gson = GsonBuilder()
.registerTypeAdapter(Date::class.java, DateDeserializer())
.create()
}
现在您必须创建您的客户DateDeserializer
并添加日期格式,如下所示:
public class DateDeserializer implements JsonDeserializer<Date> {
@Override
public Date deserialize(JsonElement jsonElement, Type typeOF, JsonDeserializationContext context) throws JsonParseException {
try {
return new SimpleDateFormat("yyy-MM-dd'T'HH:mm:ss.SSS", Locale.US).parse(jsonElement.getAsString());
} catch (ParseException ignored) {
}
throw new JsonParseException("Unparseable date: \"" + jsonElement.getAsString()
+ "\". Supported formats: " + Arrays.toString(DateUtilz.DATE_FORMATS));
}
}
Kotlin 等效的 DateDeserializer 类
class CustomGsonConverterFactory private constructor(private val gson: Gson) : Converter.Factory() {
fun responseBodyConverter(
type: Type,
annotations: Array<Annotation>,
retrofit: Retrofit
): Converter<ResponseBody, *> {
val adapter = gson.getAdapter<*>(TypeToken.get(type))
return GsonResponseBodyConverter(gson, adapter)
}
fun requestBodyConverter(
type: Type,
parameterAnnotations: Array<Annotation>,
methodAnnotations: Array<Annotation>,
retrofit: Retrofit
): Converter<*, RequestBody> {
val adapter = gson.getAdapter<*>(TypeToken.get(type))
return GsonRequestBodyConverter(gson, adapter)
}
companion object {
fun create(gson: Gson?): CustomGsonConverterFactory {
if (gson == null) throw NullPointerException("gson == null")
return CustomGsonConverterFactory(gson)
}
}
}
最后,添加您的customGsonConverterFactory
Retrofit.Builder()
....
.addConverterFactory(CustomGsonConverterFactory.create(GsonUtils.getGson()))
推荐阅读
- automation - 赛普拉斯 - 通过时不要录制视频
- java - 为 java 链码添加属性文件
- java - Realm Java 排序使 changelistener 变慢
- hibernate - 当我在 Jaxrs 资源上添加 @Transactional 时发生异常
- postgresql - 从交易表中查询历史余额数据
- html - 如何对齐主体以在中心显示元素?
- python - 如何在 Flask-User 中获取用户注册的信号
- python - 通过 Python 运行手部检测模型 tensorflow-lite
- python - Beautifulsoup 多个 div 内容到字典
- java - Spring Boot 中的 Log4j2 未使用 XML 文件中的模式