Search code examples
javagson

How to deserialize String to java Instant


I have a a JSON string as :

{
    "personId": "person1",
    "userId": "user1"
    "details": [
        {
            "homeId": "home1",
            "expireAt": "2023-03-08T15:17:04.506Z"
        }
    ]
}

And

@Data
@Builder
public class MyResponse {
    private String personId;
    private String userId;
    private List<Details> details;
}
@Data
@Builder
public class Details {
    private String homeId;
    private Instant expireAt;
}

I am trying to deserialize the JSON String to MyResponse as :

Gson().fromJson(string, MyResponse.class)

but getting the below expcetion for expireAt field:

Expected BEGIN_OBJECT but was STRING at line 1 column 24 path $.details[0].expireAt

How can I resolve this ?


Solution

  • The exception you're getting is because the "expireAt" field in the JSON is a string, but in the Details class it's declared as an Instant type. You need to tell Gson how to convert the string to an Instant.

    You can create a custom Gson deserializer for the Instant type, like this:

    public class InstantDeserializer implements JsonDeserializer<Instant> {
      @Override
      public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        return Instant.parse(json.getAsString());
      }
    }
    

    Then, you can register this deserializer with Gson before parsing the JSON string:

    Gson gson = new GsonBuilder()
                .registerTypeAdapter(Instant.class, new InstantDeserializer())
                .create();
    MyResponse response = gson.fromJson(string, MyResponse.class);