Я работаю с ответом JSON, который неправильно отформатирован. Все поля возвращаются как Strings
. К сожалению, У меня нет контроля над данными возврата.NumberFormatException в GSON при преобразовании строки в double
Я использую Gson и пытается разобрать объект JSON, который включает в себя поле, как это:
{
[...]
"cost": "9.25"
}
Это, очевидно, должно быть напечатано как Number
. Когда я пытаюсь разобрать это как String
, Number
или double
я получаю NumberFormatException:
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException:
[...]
at com.myapp.android.LauncherActivity$1.onSuccess(LauncherActivity.java:69)
[...]
Caused by: java.lang.NumberFormatException:
at org.apache.harmony.luni.util.FloatingPointParser.parseDouble(FloatingPointParser.java:267)
at java.lang.Double.parseDouble(Double.java:285)
at com.google.gson.stream.JsonReader.nextInt(JsonReader.java:599)
at com.google.gson.internal.bind.TypeAdapters$7.read(TypeAdapters.java:228)
... 19 more
LauncherActivity Линия 69:
Item item = gson.fromJson(response, Item.class);
Так я последовал this similar question и попытался создать TypeAdapter
как так :
public class CostTypeAdapter implements JsonDeserializer<Double>, JsonSerializer<Double> {
public Double deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
Double cost;
try {
cost = json.getAsDouble();
} catch (NumberFormatException e) {
cost = 0.00d;
}
return cost;
}
public JsonElement serialize(Double src, Type typeOfSrc,
JsonSerializationContext context) {
return new JsonPrimitive(src);
}
}
И зарегистрировали его при создании GsonBuilder
:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Cost.class, new CostTypeAdapter());
Gson gson = builder.create();
И мой Cost
класс:
public class Cost {
private Double value;
public Cost(Double value) {
this.value = value;
}
public Double getValue() {
return value;
}
}
Но я получаю то же NumberFormatException
.
Любые идеи о том, что здесь происходит? Разве это исключение не должно быть пойманным в моем CostTypeAdapter.deserialize()
, по крайней мере?
Любая помощь/руководство очень ценится.
хотите, чтобы это было разрешено с помощью аннотации какого-то типа – Gubatron