1

私はAndroidアプリのクラウドサーバーとしてmongodbを使用しています。MongodbjavaライブラリはAndroidで機能しないため、rest apiを使用しています。次のコードを記述してjson応答を取得し、MyClassにキャストしましたが、IllegalStateExceptionが発生します。

    java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_Object at line 1 column 35

コード:

              try {  HttpGet mRequest = new HttpGet("https://api.mongolab.com/api/1/databases/mydb/collections/mycol?apiKey=myKey");    

                     DefaultHttpClient client = new DefaultHttpClient();
   try {
              HttpResponse response = client.execute(mRequest);

              InputStream source = response.getEntity().getContent();

              Reader reader = new InputStreamReader(source);

              Gson gson = new Gson();

          Type typeOfCollectionOfMyObject = new TypeToken<Collection<MYObject>>(){}.getType();

          quizDBObjectList = gson.fromJson(reader, typeOfCollectionOfMyObject);

          } catch (IOException e) {
          mRequest.abort();
          }

これはコード全体ではありませんが、このブロックで例外が発生しています。ヘルプはありますか?

MYObjectの定義は

           public class MYObject { 

                   private long index ;
                   private String question;
                   private String answer;
                   private String optionA;
                   private String optionB;
                   private String optionC;
                   private String optionD;
                   private String createdAt;
                   private String active;
                //getters and setters of data members
      }

そして私が得た応答は:

                           [ { "_id" : { "$oid" : "505ab996aded66f4c1ccc7f2"} , "index" : 0 , "question" : "some text ?" , "optiona" : "optionA" , "optionb" : "optionB" , "optionc" : "OptionC" , "optiond" : "optionD" , "answer" : "answer" , "created_at" : { "$date" : "2012-09-20T06:37:04.306Z"} , "Active" : "1"} , { "_id" : { "$oid" : "505ab997aded66f4c1ccc7f3"} , "index" : 1 , ..../objects like that]

明らかに、私は_idがサーバーによって応答されるという事実に気づいていませんでした。このjsonオブジェクトをカスタマイズしたクラスにキャストするための正しいクラス定義を教えてください。ありがとう

4

1 に答える 1

1

java.lang.IllegalStateException:BEGIN_ARRAYが必要ですが、1行目35列目がBEGIN_Objectでした

[これはすべてを言います、の代わりにどこかにあるべきです{。たぶん、配列の代わりに単一のオブジェクトを取得しますか?

上記は役立つかもしれませんし、そうでないかもしれません。より良い答えを得るには、以下が必要です。

  • の定義MYObject
  • 正確に解析された文字列

reader解析された文字列を取得するには、たとえば、からを読み取るStringBuiderか、Guavaを使用してより単純にしCharStreams.toString(reader)ます。

于 2012-09-24T15:52:41.937 に答える