【问题标题】:Convert json response to null or void object将 json 响应转换为 null 或 void 对象
【发布时间】:2017-04-11 13:51:55
【问题描述】:

我的代码获取 HTTP 调用的响应并将字符串转换为 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();

【问题讨论】:

  • 如果您只是传递一个空值,而不是空值类型定义怎么办?在这种情况下,您甚至无法调用 gson.fromJson,而只需从您的方法中返回 null

标签: java json gson


【解决方案1】:

看起来你只是使用:

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

如果出于某种正当原因,您无法将null 传递给fromJson 方法,您可以创建一个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","bar"]
类 java.lang.Void
- 空
- 空
无效
- 空
- 空

请注意,类型标记主要用于构建泛型类型的类型信息。在更简单的情况下,您可以使用.class 获取Class&lt;?&gt;int.classInteger.classvoid.classVoid.classint[][][][][].class 等。

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多