将json响应转换为空或无效对象

将json响应转换为空或无效对象

问题描述:

我的代码获取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'。 –

看起来你只需使用:

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