我有一个 JSON 字符串:
{
    "personId": "person1",
    "userId": "user1"
    "details": [
        {
            "homeId": "home1",
            "expireAt": "2023-03-08T15:17:04.506Z"
        }
    ]
}
和
@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;
}
我正在尝试将 JSONString反序列化为MyResponse:
Gson().fromJson(string, MyResponse.class)
但得到以下字段的期望expireAt:
Expected BEGIN_OBJECT but was STRING at line 1 column 24 path $.details[0].expireAt
我该如何解决这个问题?
小智 5
您遇到的异常是因为 JSON 中的“expireAt”字段是一个字符串,但在 Details 类中它被声明为 Instant 类型。您需要告诉 Gson 如何将字符串转换为 Instant。
您可以为 Instant 类型创建自定义 Gson 反序列化器,如下所示:
public class InstantDeserializer implements JsonDeserializer<Instant> {
  @Override
  public Instant deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    return Instant.parse(json.getAsString());
  }
}
然后,您可以在解析 JSON 字符串之前向 Gson 注册此反序列化器:
Gson gson = new GsonBuilder()
            .registerTypeAdapter(Instant.class, new InstantDeserializer())
            .create();
MyResponse response = gson.fromJson(string, MyResponse.class);