Я работаю с JSON-ответом, который неправильно отформатирован. Все поля возвращаются как Strings
. К сожалению, У меня нет контроля над возвращаемыми данными .
Я использую 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 Line 69:
Item item = gson.fromJson(response, Item.class);
Итак, я последовал за этим похожим вопросом и попытался создать 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()
, по крайней мере?
Любая помощь / руководство очень ценится.