2017-04-17 25 views
0

私のWebサーバーからJSONを解析しようとしています。データを取得することは問題ではありませんが、JSONObjectを作成しようとすると、常にnullが返されます。Android JSONObjectは常に「null」を返します

マイJSON:

{"apikey":"c34750f19843vo45239o","error":false} 

そして、私のJava:

private class GetJSON extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 

    @Override 
    protected Void doInBackground(Void... arg0) { 
     JSONResult = null; 
     HttpHandler sh = new HttpHandler(); 
     sh.HTTPMethod = DefaultMethod; 

     // Making a request to url and getting response 
     String jsonStr = sh.makeServiceCall(ApiUrl+tmpUrl); 

     System.out.println("Response from "+ApiUrl+tmpUrl+": " + jsonStr); 

     if (jsonStr != null) { 
      try { 
       JSONResult = new JSONObject(jsonStr); 

      } catch (final JSONException e) { 
       System.out.println("Json parsing error: " + e.getMessage()); 
      } 
     } else { 
      System.out.println("Couldn't get json from server."); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     clearRequest(); 
    } 

} 

私はjsonStr.toString()と試みたが、同じ結果しています。 JSON文字列もJavaでログできますが、解析されません。

if(JSONResult != null && JSONResult.has("apikey")) { 
    ApiKey = JSONResult.getString("apikey"); 
    System.out.println("Successfully got ApiKey: "+ApiKey); 
}else{ 
    if(JSONResult == null){System.out.println("Is Null");} 
} 

私の悪い英語のため申し訳ありません:それはnullを返すところ

です。あなたが理解したいと思います:)

+0

あなたの回答は何ですか? –

+0

まず、Webサーバーからの応答をログに記録してください。接続またはsmthで問題が発生している可能性があります。 –

+0

@A_J応答をログに記録しました..すべて正常です。 – NeXuS

答えて

1

ちょうど推測してみます。

ほとんどの場合、結果が受信される前に確認します。 AsyncTaskはメインスレッドとは非同期で実行され、結果が使用できるようになるまで終了するまで待つ必要があります。

実際、それがonPostExecuteメソッドがある理由です。これは、結果を処理するための正しい場所です。

+0

それはそうです!ありがとう:)それが終了した場合、クラスの外からチェックすることは可能ですか? onClickListenerのようなもの? – NeXuS

+0

いいえ、直接ではありません。あなたが本当に望むものではありません。 'AsyncTask'が終了するのを待つことで、再びメインスレッドがブロックされます。 'onPostExecute'メソッドを使用して結果を処理します。 – Henry

0

JSONObjectを初期化する必要がありますJSONResult = null;あなたのコードを十分に示さなかったので、自分のdoInBackgroundメソッド

@Override 
    protected Void doInBackground(Void... arg0) { 
     JSONObject JSONResult = null; 
     HttpHandler sh = new HttpHandler(); 
     sh.HTTPMethod = DefaultMethod; 

     // Making a request to url and getting response 
     String jsonStr = sh.makeServiceCall(ApiUrl+tmpUrl); 

     System.out.println("Response from "+ApiUrl+tmpUrl+": " + jsonStr); 

     if (jsonStr != null) { 
      try { 
       JSONResult = new JSONObject(jsonStr); 

      } catch (final JSONException e) { 
       System.out.println("Json parsing error: " + e.getMessage()); 
      } 
     } else { 
      System.out.println("Couldn't get json from server."); 
     } 

     return null; 
    } 

で は、この

+0

AssyncTaskの外で初期化しています...それを内部で初期化する必要がありますか? – NeXuS

+0

グローバルを初期化しても問題はありません。 – Dilip

関連する問題