将JSON字符串转换为JAVA中的通用对象(使用GSON)

前端之家收集整理的这篇文章主要介绍了将JSON字符串转换为JAVA中的通用对象(使用GSON)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个返回 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

猜你在找的JavaScript相关文章