2017-04-11 29 views
0

我的代碼獲取HTTP調用的響應並將該字符串轉換爲Json對象。將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的原因是,這個方法的響應包含大量的成員,而且我不想創建一個擁有所有這些成員初始化的POJO,所以我可以轉換爲一個gson對象,這對我來說甚至沒有用處。

理想情況下,如果有類似的東西,那就是我正在尋找的東西。

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

如果你簡單地傳遞一個空,不是一個空類型定義?在這種情況下,你甚至不能調用gson。fromJson'只是簡單地從你的方法中返回'null'。 –

回答

2

看起來你只需使用:

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

如果由於某種正當理由的,可以不通過nullfromJson方法,你可以創建一個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」 的, 「酒吧」]
類java.lang.Void的
- 空
- 空空隙

- 空
- 空

注意,類型令牌大多采用爲泛型類型構建一個類型信息。在更簡單的情況下,你可以使用.class獲得Class<?>int.classInteger.classvoid.classVoid.classint[][][][][].class