今天我在寻找一个东西,因为我的课程中有 java.time.Instant
,而默认的gson无法反序列化它。我的POJOs看起来像这样:
open class RewardResult(
@SerializedName("id")
var id: Int,
@SerializedName("title")
var title: String?,
@SerializedName("details")
var details: String?,
@SerializedName("image")
var image: String?,
@SerializedName("start_time")
var startTimeUtcZulu: Instant?,
@SerializedName("end_time")
var endTimeUtcZulu: Instant?,
@SerializedName("unlock_expiry")
var unlockExpiryTimeUtcZulu: Instant?,
@SerializedName("target")
var target: Int,
@SerializedName("reward")
var rewardItem: RewardItem
);
data class RewardItem(
@SerializedName("type")
var type: String?,
@SerializedName("item_id")
var itemId: Int,
@SerializedName("amount")
var amount: Int
)
然后对于Instant
变量,我解析JSON的时间变量并将字符串转换为Instant
。对于整数、字符串等,我使用jsonObject.get("id").asInt
等方法。对于其他POJO,我使用默认的反序列化程序,如下所示:
val rewardItem: RewardItem = context!!.deserialize(rewardJsonElement,
RewardItem::class.java);
因此,相应的自定义反序列化程序如下所示:
val customDeserializer: JsonDeserializer<RewardResult> = object : JsonDeserializer<RewardResult> {
override fun deserialize(json: JsonElement?, typeOfT: Type?, context: JsonDeserializationContext?): RewardResult {
val jsonObject: JsonObject = json!!.asJsonObject;
val startTimeString: String? = jsonObject.get("start_time")?.asString;
var startTimeUtcZulu: Instant? = createTimeInstant(startTimeString);
val endTimeString: String? = jsonObject.get("end_time")?.asString;
var endTimeUtcZulu: Instant? = createTimeInstant(endTimeString);
val unlockExpiryStr: String? = jsonObject.get("unlock_expiry")?.asString;
var unlockExpiryUtcZulu: Instant? = createTimeInstant(unlockExpiryStr);
val rewardJsonElement: JsonElement = jsonObject.get("reward");
val rewardItem: ridmik.one.modal.reward.RewardItem = context!!.deserialize(rewardJsonElement,
ridmik.one.modal.reward.RewardItem::class.java);
var output: ridmik.one.modal.reward.RewardResult = ridmik.one.modal.reward.RewardResult(
id = jsonObject.get("id").asInt,
title = jsonObject.get("title")?.asString,
details = jsonObject.get("details")?.asString,
image = jsonObject.get("image")?.asString,
startTimeUtcZulu = startTimeUtcZulu,
endTimeUtcZulu = endTimeUtcZulu,
unlockExpiryTimeUtcZulu = unlockExpiryUtcZulu,
target = jsonObject.get("target").asInt,
rewardItem = rewardItem
);
Timber.tag(TAG).e("output = "+output);
return output;
}
}
最终,我像这样创建了自定义的Gson:
val gsonBuilder = GsonBuilder();
gsonBuilder.registerTypeAdapter(RewardResult::class.javaObjectType,
this.customJsonDeserializer);
val customGson: Gson = gsonBuilder.create();