gson 如何将String反序列化为java Instant

zsohkypk  于 2023-03-12  发布在  Java
关注(0)|答案(1)|浏览(235)

我有一个JSON字符串为:

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

还有
x一个一个一个一个x一个一个二个x
我尝试将JSON String反序列化为MyResponse,如下所示:

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

expireAt字段的预期如下:
Expected BEGIN_OBJECT but was STRING at line 1 column 24 path $.details[0].expireAt
我该如何解决这个问题?

xqk2d5yq

xqk2d5yq1#

您遇到的例外是因为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);

相关问题