2016-04-10 9 views
1

私は天気情報を取得するためにJSONObject forecast = new JSONObject(response.body()。string())を使用しますが、アンドロイドモニターは常に "org.json .JSONException: "0"の文字の入力の終わりです。org.json.JSONException:文字0での入力の終了

import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.os.Debug; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.Toast; 


import org.json.JSONException; 
import org.json.JSONObject; 

import java.io.IOException; 

import okhttp3.Call; 
import okhttp3.Callback; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.Response; 

public class MainActivity extends AppCompatActivity { 

private static final String TAG = MainActivity.class.getSimpleName(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    if(isconnected()){ 
     String url = "https://api.forecast.io/forecast/2d0f15adaeff2c8e1343201418843890/37.8267,-122.423"; 
     OkHttpClient client = new OkHttpClient(); 
     Request request = new Request.Builder().url(url).build(); 


     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, IOException e) { 

      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 

       if (response.isSuccessful()) { 
        Log.d(TAG, response.body().string()); 
        String a=response.body().string(); 

        try { 
         JSONObject forecast = new JSONObject(a); 

        } catch (JSONException e) { 
         e.printStackTrace(); 

        } 

       } else { 
        alertUserAboutError(); 

       } 


      } 
     }); 
    } 

    else{ 
     Toast.makeText(MainActivity.this,"LOST CONNECTION",Toast.LENGTH_SHORT).show(); 
    } 



    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().hide(); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
} 

private boolean isconnected() { 
    ConnectivityManager cm = 
      (ConnectivityManager)MainActivity.this.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
    boolean isConnected = activeNetwork != null && 
      activeNetwork.isConnectedOrConnecting(); 
    return isConnected; 

} 

private void alertUserAboutError() { 
    AlertDialogFragment alertDialogFragment = new AlertDialogFragment(); 
    alertDialogFragment.show(getSupportFragmentManager(), "error"); 

} 

} 

私は(それが文字列であるテストするLog.dを(TAG、response.body()。文字列())を使用しますが、JSONObject予報で=新しいJSONObject(response.body()。文字列))、 うまくいかないだろう。

+0

この例外は、応答がnullまたは空であったことを意味します。 – DeeV

+0

"それはうまくいかない"とはどういう意味ですか? – nasch

答えて

4

回答:応答オブジェクトは、汎用タイプの - ResponseBodyである必要があります。
下記を参照参考のためにコードを修正してください。
は今response.body()メソッドは、オブジェクトがResponseBody すなわち、ここで

ResponseBody rb = response.body(); 
rb.string(); 

はメソッド Stringオブジェクトを返しますが、内部 string()メソッドが呼び出される string()方法一度空の応答を行う Util.closeQuietly(source);呼び出し string()を持ってResponseBody返します。

Log.d(TAG, response.body().string());を削除して、次のコードに従ってください。


リファレンス - okhttp3.ResponseBody.java

エラー:org.json.JSONException:文字の入力の終了0

正しいコード:いくつかの奇妙な理由で

@Override 
public void onResponse(Call call, Response<ResponseBody> response) throws IOException { 
    if (response.isSuccessful()) { 

     String remoteResponse=response.body().string(); 
     Log.d(TAG, remoteResponse); 
     try { 
      JSONObject forecast = new JSONObject(remoteResponse); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
0

"if(response.isSuccessful())"の前に "String a = response.body()。string()"を移動した後、この問題を解決しました。

3

.string()> 1回使用すると、応答は空になりますy。 Retrofitレスポンスを解析するときに一度だけ使用してください。

なぜこのように起こるのか知っている誰かが、私の答えを改善してください。

+1

ありがとうございます。これはうまくいった。私は応答を得ています(NULLではなく、空でもない)。まだ私はこのエラーが発生していた。最初の.string()呼び出しを削除しました。現在は正常に動作しています。 –

+0

ありがとう、私も同じ問題がありました。文字列を保持したい場合は、フィールドに入力します。 –

関連する問題