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

有没有办法让改造/gson 将双时间戳转换为长?

有没有办法让改造/gson 将双时间戳转换为长?

慕娘9325324 2022-10-07 19:34:16
我正在开发一个Android应用程序。我正在使用改造Gson来调用服务器并序列化/反序列化。在请求中,有一个包含timestamp( long) 的响应类。有时这是double因为iOS应用程序的版本double用于存储时间戳。有没有办法强制Gson反序列化响应并转换为Response类(长)上存在的对象?例外:Caused by com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: Expected a long but was 1555323142345.364 at line 1 column 1002 path $.userSettings.stories[4].readTimestamp       at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:323)       at com.google.gson.internal.bind.TypeAdapters$11.read(TypeAdapters.java:313)       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)       at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)       at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:129)       at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:220)
查看完整描述

1 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

为简单起见,假设您的JSON有效负载是:


{

    "timestamp": 1555323142345.345

}

它应该适合:


class Pojo {


    private long timestamp;


    // getters, setters, toString

}

解决方案取决于您是否可以更改Pojo模型。如果是并且您想要存储double并且long可以将类型更改为Number:


private Number timestamp;

你应该能够解析double' 和long' 的时间戳。如果您总是想要long实现自定义反序列化器:


class LongOrDoubleJsonDeserializer implements JsonDeserializer<Long> {


    @Override

    public Long deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

        if (json.isJsonPrimitive()) {

            Number number = json.getAsNumber();


            return number.longValue();

        }


        return null;

    }

}

您的Pojo财产应如下所示:


@JsonAdapter(LongOrDoubleJsonDeserializer.class)

private long timestamp;

如果您无法更改Pojo课程,则需要TypeAdapterFactory使用自定义和注册GsonBuilder。请参阅此链接:创建改造实例。自定义实现可能如下所示:


class LongOrDoubleTypeAdapterFactory implements TypeAdapterFactory {


    @Override

    public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) {

        Class<? super T> rawType = type.getRawType();

        if (rawType == Long.class || rawType == long.class) {

            return new TypeAdapter<T>() {

                @Override

                public void write(JsonWriter out, T value) {

                }


                @Override

                public T read(JsonReader in) throws IOException {

                    try {

                        return (T) new Long(in.nextLong());

                    } catch (NumberFormatException e) {

                        return (T) new Long(((Double) in.nextDouble()).longValue());

                    }

                }

            };

        }

        return null;

    }

}

并注册如下:


Gson gson = new GsonBuilder()

    .registerTypeAdapterFactory(new LongOrDoubleTypeAdapterFactory())

    .create();


查看完整回答
反对 回复 2022-10-07
  • 1 回答
  • 0 关注
  • 112 浏览

添加回答

举报

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