2016-04-10 2 views
1

Я использую JSONObject прогноз = новый JSONObject (response.body(). String()), чтобы получать информацию о погоде, но монитор Android всегда показывает «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

Это исключение означает, что ответ был либо пустым, либо пустым. – DeeV

+0

Что значит «это не сработает»? – nasch

ответ

4

Ответ объекта обязательный общего типа - ResponseBody.
См. Ниже Исправить код для справки.
Теперь response.body() метод возвращает объект ResponseBody т.е.

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

Здесь ResponseBody есть метод, который возвращает string()String объекта, но внутренне string() метод вызывает Util.closeQuietly(source);, что делает ответ пустой раза метода string() вызывается.

Просто удалите 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

Я решил эту проблему после перемещения «String a = response.body(). String()« before »if (response.isSuccessful())».

3

По какой-то странной причине если вы используете .string()> 1 раз, ответ оказывается empt у. Попытайтесь использовать его только один раз при анализе ответа Retrofit.

Кто-то, кто знает, почему так происходит, пожалуйста, улучшите мой ответ.

+1

Спасибо человек. Это сработало. Я получаю ответ (NOT NULL, NOT EMPTY). все еще я получал эту ошибку. Убрал первый вызов .string(), теперь работает хорошо. –

+0

Большое вам спасибо, у меня тоже была такая же проблема. Если u хочет сохранить строку, поместите ее в поле. –

Смежные вопросы