为了账号安全,请及时绑定邮箱和手机立即绑定

如何为GSON编写自定义JSON反序列化器?

如何为GSON编写自定义JSON反序列化器?

偶然的你 2019-07-05 15:30:10
如何为GSON编写自定义JSON反序列化器?我有一个Java类,用户:public class User{     int id;     String name;     Timestamp updateDate;}我收到一个包含来自webservice的用户对象的JSON列表:[{"id":1,"name":"Jonas","update_date":"1300962900226"},{"id":5,"name":"Test","date_date":"1304782298024"}]我试图编写一个自定义反序列化器:@Overridepublic 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反序列化程序?
查看完整描述

3 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

@Overridepublic User deserialize(JsonElement json, Type type,
        JsonDeserializationContext context) throws JsonParseException {

    JsonObject jobject = json.getAsJsonObject();

    return new User(
            jobject.get("id").getAsInt(), 
            jobject.get("name").getAsString(), 
            new Timestamp(jobject.get("update_date").getAsLong()));}

我假设User类具有适当的构造函数。


查看完整回答
反对 回复 2019-07-05
?
白板的微信

TA贡献1883条经验 获得超3个赞

我将采取以下略有不同的方法,以便将代码中的“手动”解析最小化,因为不必要地进行其他操作,这在某种程度上违背了我最初使用像gson这样的API的目的。

// output:// [User: id=1, name=Jonas, updateDate=2011-03-24 03:35:00.226]// [User: id=5, name=Test, updateDate=2011-05-07 08:31:38.024]
// using java.sql.Timestamppublic class Foo{
  static String jsonInput = 
    "[" +
      "{\"id\":1,\"name\":\"Jonas\",\"update_date\":\"1300962900226\"}," +
      "{\"id\":5,\"name\":\"Test\",\"update_date\":\"1304782298024\"}" +
    "]";

  public static void main(String[] args)
  {
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES);
    gsonBuilder.registerTypeAdapter(Timestamp.class, new TimestampDeserializer());
    Gson gson = gsonBuilder.create();
    User[] users = gson.fromJson(jsonInput, User[].class);
    for (User user : users)
    {
      System.out.println(user);
    }
  }}class User{
  int id;
  String name;
  Timestamp updateDate;

  @Override
  public String toString()
  {
    return String.format(
      "[User: id=%1$d, name=%2$s, updateDate=%3$s]",
      id, name, updateDate);
  }}class TimestampDeserializer implements JsonDeserializer<Timestamp>{
  @Override
  public Timestamp deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
      throws JsonParseException
  {
    long time = Long.parseLong(json.getAsString());
    return new Timestamp(time);
  }}

(这假定原始问题中的“Date_Date”应该是“UPDATE_DATE”)。


查看完整回答
反对 回复 2019-07-05
?
aluckdog

TA贡献1847条经验 获得超7个赞

我肯定更喜欢这个模型-如果时间戳是唯一不能解析的东西,最好是让时间戳反序列化,而不是手动解析整个用户对象,因为gson已经完全能够这样做了

查看完整回答
反对 回复 2019-07-05
  • 3 回答
  • 0 关注
  • 668 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信