如何为 Gson 编写自定义 JSON 反序列化器?
我有一个 Java 类 User:
public class User
{
int id;
String name;
Timestamp updateDate;
}
我收到一个包含来自 Web 服务的用户对象的 JSON 列表:
[{"id":1,"name":"Jonas","update_date":"1300962900226"},
{"id":5,"name":"Test","date_date":"1304782298024"}]
我尝试编写一个自定义反序列化器:
@Override
public User deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
return new User(
json.getAsJsonPrimitive().getAsInt(),
json.getAsString(),
json.getAsInt(),
(Timestamp)context.deserialize(json.getAsJsonPrimitive(),
Timestamp.class));
}
但我的反序列化器不起作用。如何为 Gson 编写自定义 JSON 反序列化器?
I have a Java class, User:
public class User
{
int id;
String name;
Timestamp updateDate;
}
And I receive a JSON list containing user objects from a webservice:
[{"id":1,"name":"Jonas","update_date":"1300962900226"},
{"id":5,"name":"Test","date_date":"1304782298024"}]
I have tried to write a custom deserializer:
@Override
public User deserialize(JsonElement json, Type type,
JsonDeserializationContext context) throws JsonParseException {
return new User(
json.getAsJsonPrimitive().getAsInt(),
json.getAsString(),
json.getAsInt(),
(Timestamp)context.deserialize(json.getAsJsonPrimitive(),
Timestamp.class));
}
But my deserializer doesn't work. How can I write a custom JSON deserializer for Gson?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我会采取如下稍微不同的方法,以便最大限度地减少代码中的“手动”解析,因为不必要地这样做会在某种程度上违背我首先使用像 Gson 这样的 API 的目的。
(这假设原始问题中的“date_date”应该是“update_date”。)
I'd take a slightly different approach as follows, so as to minimize "manual" parsing in my code, as unnecessarily doing otherwise somewhat defeats the purpose of why I'd use an API like Gson in the first place.
(This assumes that "date_date" should be "update_date", in the original question.)
我假设 User 类有适当的构造函数。
I'm assuming User class has the appropriate constructor.
今天我正在寻找这个东西,因为我的类有 java.time.Instant 并且默认的 gson 无法反序列化它。我的 POJO 如下所示:
然后,对于
Instant
变量,我解析 json 的时间变量并将字符串转换为 Instant。对于整数、字符串等,我使用 jsonObject.get("id").asInt 等。对于其他 pojo,我使用默认的反序列化器,如下所示:因此相应的自定义反序列化器如下所示:
最后,我像这样创建自定义 gson:
Today I was looking for this thing as my class had
java.time.Instant
and the default gson could not deserialize it. My POJOs look like this:Then for
Instant
variables, I parse the json's time variables and convert string to Instant. For integer , string, etc I usejsonObject.get("id").asInt
etc. For other pojo, I use the default deserializer like this:So the corresponding custom deserializer looks like this:
Finally, I create my custom gson like this: