将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();
答
看起来你只需使用:
private static <T> T fromJson(final String json, final Type type) {
if (type == null) {
return null;
}
return gson.fromJson(json, type);
}
如果由于某种正当理由的,可以不通过null
到fromJson
方法,你可以创建一个Void
和void
- 友好型适配器将其绑定到您的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.class
,Integer.class
,void.class
,Void.class
,int[][][][][].class
等
如果你简单地传递一个空,不是一个空类型定义?在这种情况下,你甚至不能调用gson。fromJson'只是简单地从你的方法中返回'null'。 –