亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

有沒有辦法讓改造/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 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號