1 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
為簡(jiǎn)單起見,假設(shè)您的JSON有效負(fù)載是:
{
"timestamp": 1555323142345.345
}
它應(yīng)該適合:
class Pojo {
private long timestamp;
// getters, setters, toString
}
解決方案取決于您是否可以更改Pojo模型。如果是并且您想要存儲(chǔ)double并且long可以將類型更改為Number:
private Number timestamp;
你應(yīng)該能夠解析double' 和long' 的時(shí)間戳。如果您總是想要long實(shí)現(xiàn)自定義反序列化器:
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財(cái)產(chǎn)應(yīng)如下所示:
@JsonAdapter(LongOrDoubleJsonDeserializer.class)
private long timestamp;
如果您無法更改Pojo課程,則需要TypeAdapterFactory使用自定義和注冊(cè)GsonBuilder。請(qǐng)參閱此鏈接:創(chuàng)建改造實(shí)例。自定義實(shí)現(xiàn)可能如下所示:
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;
}
}
并注冊(cè)如下:
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(new LongOrDoubleTypeAdapterFactory())
.create();
添加回答
舉報(bào)