1 回答

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();
添加回答
舉報