我有一个返回
JSON的Api.响应是某种格式,可以适合称为ApiResult的对象,并包含Context< T>.和一个国际代码.
ApiResult以通用方式声明,例如ApiResult< SomeObject>
我想知道如何让GSON将传入的JSON字符串转换为ApiResult< T>
到目前为止我有:
Type apiResultType = new TypeToken<ApiResult<T>>() { }.getType(); ApiResult<T> result = gson.fromJson(json,apiResultType);
但是这仍然返回将Context转换为LinkedHashMap(我假设它是GSON回退的)
解决方法
你必须知道T将是什么.传入的JSON基本上只是文本. GSON不知道你希望它成为什么对象.如果JSON中有一些东西可以用来创建你的T实例,你可以这样做:
public static class MyJsonAdapter<X> implements JsonDeserializer<ApiResult<X>> { public ApiResult<X> deserialize( JsonElement jsonElement,Type type,JsonDeserializationContext context ) throws JsonParseException { String className = jsonElement.getAsJsonObject().get( "_class" ).getAsString(); try { X myThing = context.deserialize( jsonElement,Class.forName( className ) ); return new ApiResult<>(myThing); } catch ( ClassNotFoundException e ) { throw new RuntimeException( e ); } } }
我正在使用字段“_class”来决定我的X需要什么,并通过反射实例化它(类似于PomPom的例子).你可能没有这样一个明显的领域,但是你必须有一些方法来查看JsonElement,并根据它应该是什么类型的X来决定它.
这段代码是类似我之前用GSON做的类似的黑客版本,见第184行:https://github.com/chriskessel/MyHex/blob/master/src/kessel/hex/domain/GameItem.java