0

我是 Java 和 Android 的新手,所以请多多包涵。我正在尝试创建一个函数,该函数调用 wcf 服务并将返回的结果从 JSON 转换为 Java 对象(我将类型作为 object 传递t),但它抛出了一个空指针异常t,这一定是null我只想传递正确类型的对象,以便在转换时填充。请帮助我。

    public static String Post(String serviceURL, Map<String, String> entites,
        Class<?> t) {
    String responseString = "";
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);


            Gson gson = new GsonBuilder().create();
            //now we will try to convert the class to the specified type.
            t = (Class<?>) gson.fromJson(responseString, t);



    } catch (Exception e) {

        responseString = e.toString();

    }
    return responseString;

非常感谢。

经过一些尝试,我最终得到了这段代码,但我仍然面临空指针异常。

    MemberInfo mem = new MemberInfo();

    TypeToken<MemberInfo> m = null ;
    ServiceCaller.Post(getString(R.string.LoginService), values , m);


            Gson gson = new GsonBuilder().create();
            //now we will try to convert the class to the specified type.
            t = (TypeToken<T>) gson.fromJson(responseString, (Type) t);
4

1 回答 1

0

据我所知,这是不可能的。为了做到这一点,gson 必须能够仅从序列化的字符串中检测到正确的类。但是,可以通过多种有效方式解释单个字符串。例如,以 gson 网站上的示例为例:

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  BagOfPrimitives() {
    // no-args constructor
  }
}

Gson.toJson在此类的实例上使用会产生以下字符串:

{"value1":1,"value2":"abc"}

但是,如果我创建了另一个在所有方面都与第一个相同的类,但名称:

class SackOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  SackOfPrimitives() {
    // no-args constructor
  }
}

然后这也将序列化为相同的字符串:

{"value1":1,"value2":"abc"}

我的观点是,给定一个类似的字符串{"value1":1,"value2":"abc"},gson 无法确定是否应该将其反序列化为 typeBagOfPrimitives或 type的对象SackOfPrimitives。因此,您始终必须为 gson 提供正确的类型,因为 gson 无法自行解决。

于 2013-10-05T15:53:10.153 回答