From 0351b0e9a34432ee85215f4e9dcf8ab9c005f785 Mon Sep 17 00:00:00 2001 From: Chris Maeda Date: Thu, 15 Sep 2022 00:11:23 -0400 Subject: [PATCH] fix: Deserialize java.time.Instant objects that are represented as JSON objects (#16321) Deserialize java.time.Instant objects that are represented as JSON objects; e.g {"nano": 790000000,"epochSecond": 1641498664} --- .../GsonISOStringToInstantConverter.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/converters/GsonISOStringToInstantConverter.java b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/converters/GsonISOStringToInstantConverter.java index a3768eb119..eb4f3191fd 100644 --- a/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/converters/GsonISOStringToInstantConverter.java +++ b/app/server/appsmith-interfaces/src/main/java/com/appsmith/external/converters/GsonISOStringToInstantConverter.java @@ -3,6 +3,7 @@ package com.appsmith.external.converters; import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; +import com.google.gson.JsonObject; import com.google.gson.JsonParseException; import com.google.gson.JsonPrimitive; import com.google.gson.JsonSerializationContext; @@ -33,6 +34,33 @@ public class GsonISOStringToInstantConverter implements JsonSerializer, // do nothing, let's try to parse with Instant.parse assuming it's in ISO format } } + + // In other versions of Appsmith, we have observed Instants saved as JSON objects. E.g. + // "deletedAt": { + // "nano": 790000000, + // "epochSecond": 1641498664 + // } + if (jsonElement.isJsonObject()) { + JsonObject timeObject = jsonElement.getAsJsonObject(); + JsonElement epochSecondElt = timeObject.get("epochSecond"); + JsonElement nanoElt = timeObject.get("nano"); + Long epochSecond = (epochSecondElt != null ? epochSecondElt.getAsLong() : null); + Long nano = (nanoElt != null ? nanoElt.getAsLong() : null); + if (epochSecond != null) + { + if (nano != null) + { + Instant val = Instant.ofEpochSecond(epochSecond, nano); + return val; + } + else + { + Instant val = Instant.ofEpochSecond(epochSecond); + return val; + } + } + } + return Instant.parse(jsonElement.getAsString()); }