JSON レスポンスのデシリアライズで Gson を使用して NumberFormatException を処理する方法 質問する

JSON レスポンスのデシリアライズで Gson を使用して NumberFormatException を処理する方法 質問する

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 Stringint 値ではなく空の文字列が返されるため、がスローされます。

Gsonに「runtimeTypeのフィールドをデシリアライズしてFooNumberFormatExceptionが発生した場合は、デフォルト値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();

参照してくださいこのリンク多くのための。

おすすめ記事