Данные, возвращаемые из API моего приложения, содержат цену продукта, сохраненную в виде строки, например:
{
price:"1500"
}
Это вызывает исключение NumberFormatException, поскольку тип данных, используемый в модели Product, является BigDecimal. Как мне разобрать эту строку из базы данных в BigDecimal перед ее использованием в приложении?
Я использую Retrofit и GSON, и попробовал решения здесь:
NumberFormatException в GSON при преобразовании String в удвоение
Решение 1:
GsonBuilder gb = new GsonBuilder();
gb.registerTypeAdapter(Float.class, new TypeAdapter<Float>() {
@Override
public Float read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
String stringValue = reader.nextString();
try {
Float value = Float.valueOf(stringValue);
return value;
} catch (NumberFormatException e) {
return null;
}
}
@Override
public void write(JsonWriter writer, Float value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
});
Это решение кажется правильным, но мне не удалось вернуть проанализированное значение при возникновении исключения, вместо возврата null.
Решение 2:
.registerTypeAdapter(Double.class, new JsonSerializer<Double>() {
public JsonElement serialize(Double number, Type type, JsonSerializationContext context) {
return new JsonPrimitive(Double.valueOf(number));
}
})
Для этого решения BigDecimal не поддерживается типом данных JsonPrimitive.