Но мой десериализатор не работает. Как я могу написать пользовательский десериализатор JSON для Gson?
Переведено автоматически
Ответ 1
Я бы выбрал несколько иной подход следующим образом, чтобы свести к минимуму "ручной" синтаксический анализ в моем коде, поскольку излишнее выполнение других действий несколько противоречит цели, по которой я вообще использовал API, подобный Gson.
Я предполагаю, что пользовательский класс имеет соответствующий конструктор.
Ответ 3
Сегодня я искал эту вещь, поскольку у моего класса была java.time.Instant и gson по умолчанию не смог ее десериализовать. Мои POJOs выглядят следующим образом:
openclassRewardResult( @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?, // Unit: Utc / Zulu. Unit is very important @SerializedName("end_time") var endTimeUtcZulu: Instant?, @SerializedName("unlock_expiry") var unlockExpiryTimeUtcZulu: Instant?, @SerializedName("target") var target: Int, @SerializedName("reward") var rewardItem: RewardItem );
dataclassRewardItem( @SerializedName("type") var type: String?, @SerializedName("item_id") var itemId: Int, @SerializedName("amount") var amount: Int )
Затем для Instant переменных я анализирую временные переменные json и преобразую string в Instant . Для integer , string и т.д. Я использую jsonObject.get("id").asInt etc. Для других pojo я использую десериализатор по умолчанию, подобный этому:
val rewardItem: RewardItem = context!!.deserialize(rewardJsonElement, RewardItem::class.java);
Итак, соответствующий пользовательский десериализатор выглядит следующим образом:
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); // I suppose this line means use the default jsonDeserializer