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 ?
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With