JSONレスポンスを読んでいますグソンNumberFormatException
は、期待値が空の文字列に設定されているため、時々 を返しますint
。今、私はこの種の例外を処理するための最良の方法が何であるかを考えています。値が空の文字列の場合、デシリアライズは 0 である必要があります。
期待される JSON 応答:
{
"name" : "Test1",
"runtime" : 90
}
ただし、ランタイムが空の文字列になる場合もあります。
{
"name" : "Test2",
"runtime" : ""
}
Java クラスは次のようになります。
public class Foo
{
private String name;
private int runtime;
}
デシリアライゼーションは次のようになります。
String input = "{\n" +
" \"name\" : \"Test\",\n" +
" \"runtime\" : \"\"\n" +
"}";
Gson gson = new Gson();
Foo foo = gson.fromJson(input, Foo.class);
com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String
int 値ではなく空の文字列が返されるため、がスローされます。
Gsonに「runtime
TypeのフィールドをデシリアライズしてFoo
NumberFormatExceptionが発生した場合は、デフォルト値0を返すだけです。「?」
String
私の回避策は、フィールドの Type としてruntime
ではなくを使用することですint
が、このようなエラーを処理するより良い方法があるかもしれません。
ベストアンサー1
以下は私がタイプ用に作成した例ですLong
。こちらの方がより良い選択肢です:
public class LongTypeAdapter extends TypeAdapter<Long> {
@Override
public Long read(JsonReader reader) throws IOException {
if (reader.peek() == JsonToken.NULL) {
reader.nextNull();
return null;
}
String stringValue = reader.nextString();
try {
Long value = Long.valueOf(stringValue);
return value;
} catch (NumberFormatException e) {
return null;
}
}
@Override
public void write(JsonWriter writer, Long value) throws IOException {
if (value == null) {
writer.nullValue();
return;
}
writer.value(value);
}
}
util を使用してアダプターを登録しますGson
。
Gson gson = new GsonBuilder().registerTypeAdapter(Long.class, new LongTypeAdapter()).create();
参照してくださいこのリンク多くのための。