0

私はJavaとAndroidが初めてなので、ご容赦ください。wcf サービスを呼び出し、返された結果を JSON から Java オブジェクトに変換する関数を作成しようとしています (型を object として渡しますt) が、 で null ポインター例外をスローしていますtnull正しい型のオブジェクトを渡して、変換時に満たされるようにします。親切に私を助けてください。

    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 がシリアル化された文字列からのみ正しいクラスを検出できる必要があります。ただし、1 つの文字列は多くの有効な方法で解釈できます。たとえば、gson Web サイトの例を見てみましょう。

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"}

私の要点は、 のような単一の文字列が与えられた場合、それを typeまたは type{"value1":1,"value2":"abc"}のオブジェクトに逆シリアル化する必要があるかどうかを gson が判断する方法がないということです。したがって、gson がそれ自体でそれを把握することはできないため、常に gson に正しい型を提供する必要があります。BagOfPrimitivesSackOfPrimitives

于 2013-10-05T15:53:10.153 に答える