2017-04-11 5 views
0

私のコードはHTTP呼び出しの応答を取得し、その文字列をJsonオブジェクトに変換します。nullまたはvoidオブジェクトへのjson応答の変換

return gson.fromJson(String.valueOf(execute(requestInfo.getHttpRequest())), requestInfo.getResponseType()); 

しかし、gson.fromJson方法は、あなたがそれを変換したい先のオブジェクトを指定する必要があります。

私はこの特定の呼び出しに対して応答クラスを必要とせず、void/nullを返したいと思います。しかし、これは複数のメソッド間で共有されるメソッドなので、私はをいくつかのクラスではに渡す必要があります。現時点では、私はこれを渡しています

private static final Type RETURN_TYPE = new TypeToken<NameOfMyResponseClass>() { 
    }.getType(); 

これを置き換えることはできますか?何も返されないようにするにはどうすればいいですか?

PS:nullを渡す理由は、このメソッドのレスポンスには数多くのメンバーが含まれているため、gsonオブジェクトに変換できるようにこれらのメンバーがすべて初期化されたPOJOを作成したくないということです。それは私にとっても役に立たない。

理想的には、似たようなものがあれば、それは私が探しているものです。

private static final Type RETURN_TYPE = new TypeToken<Void>() { 
     }.getType(); 
+0

:もっと簡単な例では、Class<?>を取得するために.classを使用することができますか?そのような場合には、gsonを起動することさえできません。fromJson'はメソッドからヌルを返すだけです。 –

答えて

2

それはあなたが単に使用のようになります。

private static <T> T fromJson(final String json, final Type type) { 
    if (type == null) { 
     return null; 
    } 
    return gson.fromJson(json, type); 
} 

何らかの正当な理由のために、あなたはfromJsonメソッドにnullを渡すことはできません、場合、あなたはVoidvoidやさしいタイプのアダプタを作成することができますし、 Gsonインスタンスにバインドします(もちろん、void「値」を返すことはできません)。

final class VoidTypeAdapter 
     extends TypeAdapter<Void> { 

    private static final TypeAdapter<Void> voidTypeAdapter = new VoidTypeAdapter(); 

    private VoidTypeAdapter() { 
    } 

    static TypeAdapter<Void> getVoidTypeAdapter() { 
     return voidTypeAdapter; 
    } 

    @Override 
    @SuppressWarnings("resource") 
    public void write(final JsonWriter out, final Void value) 
      throws IOException { 
     out.nullValue(); 
    } 

    @Override 
    public Void read(final JsonReader in) 
      throws IOException { 
     // Skip the current JSON tokens stream value entirely 
     in.skipValue(); 
     return null; 
    } 

} 
private static final Gson gson = new GsonBuilder() 
     .registerTypeAdapter(Void.class, getVoidTypeAdapter()) 
     .registerTypeAdapter(void.class, getVoidTypeAdapter()) 
     .create(); 
private static <T> T fromJson(final String json, final Type type) { 
    return gson.fromJson(json, type); 
} 
private static String toJson(final Object object, final Type type) { 
    return gson.toJson(object, type); 
} 

だから、簡単なテストでは、次のようになります。

private static void test(final Type type) { 
    System.out.println(type); 
    final Object value = fromJson("[\"foo\",\"bar\"]", type); 
    System.out.println("-\t" + value); 
    System.out.println("-\t" + toJson(value, type)); 
} 
public static void main(final String... args) { 
    test(new TypeToken<List<String>>() {}.getType()); 
    test(Void.class); 
    test(void.class); 
} 

出力:

java.util.Listに
- [FOO、バー]
- [ "FOO"、 "バー"]
クラスは
がjava.lang.Void - ヌル
- ヌル
空隙
- ヌル
- 型トークンはほとんど使用されているという帰

注ジェネリック型の型情報を構築します。あなたは、単にヌル、ヌルではないタイプの定義を渡すと何等のint.classInteger.classvoid.classVoid.classint[][][][][].class

関連する問題