Синтаксический анализ данных JSON в приложении Android

В своем приложении для Android я пытаюсь получить популярные медиа из Instagram, я использую класс JSONParser, показанный в этом руководстве http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {}

    public JSONObject getJSONFromUrl(String url) {
      // Making HTTP request
      try {
          // defaultHttpClient
          DefaultHttpClient httpClient = new DefaultHttpClient();
          HttpGet httpPost = new HttpGet(url);

          HttpResponse httpResponse = httpClient.execute(httpPost);
          HttpEntity httpEntity = httpResponse.getEntity();
          is = httpEntity.getContent();          
      } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
              e.printStackTrace();
          } catch (IOException e) {
                e.printStackTrace();
            }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
              Log.e("Buffer Error", "Error converting result " + e.toString());
          }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
              Log.e("JSON Parser", "Error parsing data " + e.toString());
          }

        // return JSON String
        return jObj;
    }
}

Это код, который я пытаюсь заставить работать:

private static  String urlInst = "https://api.instagram.com/v1/media/popular?client_id="+clientId;
public static  void Func() {
    JSONParser jParser = new JSONParser();
    JSONObject json = jParser.getJSONFromUrl(urlInst);
    try {
    JSONArray pics = json.getJSONArray("data");
        for (int i = 0; i < pics.length(); i++) { 
            JSONObject c=(JSONObject) pics.get(i);
            JSONObject user = c.getJSONObject("user");
            String name= user.getString("username");
            JSONObject img=c.getJSONObject("images");
            JSONObject thum=img.getJSONObject("thumbnail");
            String urlOfPic = thum.getString("url");                                  
        }
    } catch (JSONException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } 
}

Но я получаю ошибку:

Ошибка буфера: Ошибка преобразования результата java.lang.NullPointerException

Ошибка синтаксического анализа JSON при разборе данных org.json.JSONEXception: конец ввода с 0 символа

Я пытаюсь выяснить, что является причиной этой ошибки, какие-либо идеи? Насколько я вижу, ошибка в этой строке.

JSONObject json = jParser.getJSONFromUrl (urlInst);

Но я новичок, поэтому я не уверен. Помощь будет оценена.

Полный журнал ошибок:

09-08 16: 49: 22.343: ошибка E/Buffer (9981): ошибка преобразования результата java.lang.NullPointerException 09-08 16:49:22.343: анализатор E/JSON (9981): ошибка анализа данных org.json.JSONException: Конец ввода с 0 символа 09-08 16:49:22.351: E/AndroidRuntime(9981): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основной 09-08 16:49:22.351: E/AndroidRuntime(9981): java.lang.RuntimeException: Невозможно запустить действие ComponentInfo{hr.zadatak.undabot.instag/hr.zadatak.undabot.instag.StartShowing}: java.lang.NullPointerException 09-08 16:49:22.351: E/AndroidRuntime(9981): в android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 09-08 16:49:22.351: E/AndroidRuntime(9981): на android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 09-08 16:49:22.351: E/AndroidRuntime(9981): на android.app.ActivityThread.access$2300(ActivityThread.java:125) 09-08 16:49:22.351: E/AndroidRuntime(9981): на android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 09-08 16:49:22.351: E/AndroidRuntime(9981): в android.os.Handler.dispatchMessage(Handler.java:99) 09-08 16:49:22.351: E/AndroidRuntime(9981): в android.os.Looper.loop(Looper.java:123) 09-08 16:49:22.351: E/AndroidRuntime(9981): на android.app.ActivityThread.main(ActivityThread.java:4668) 09-08 16:49:22.351: E/AndroidRuntime(9981): на java.lang.reflect.Method.invokeNative(собственный метод) 09-08 16:49:22.351: E/AndroidRuntime(9981): на java.lang.reflect.Method.invoke(Method.java:521) 09-08 16:49:22.351: E/AndroidRuntime(9981): на com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878) 09-08 16:49:22.351: E/AndroidRuntime(9981): на com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636) 09-08 16:49:22.351: E/AndroidRuntime(9981): at dalvik.system.NativeStart.main(собственный метод) 09-08 16:49:22.351: E/AndroidRuntime(9981): вызвано: java.lang.NullPointerException 09-08 16:49:22.351: E/AndroidRuntime(9981): в hr.zadatak.undabot.instag.ListOfPhotos.LoadInstagramPictures(ListOfPhotos.java:51) 09-08 16:49:22.351: E/AndroidRuntime(9981): на hr.zadatak.undabot.instag.StartShowing.onCreate(StartShowing.java:16) 09-08 16:49:22.351: E/AndroidRuntime(9981): на android.app.Инструментация.callActivityOnCreate(Instrumentation.java:1047) 09-08 16:49:22.351: E/AndroidRuntime(9981): на android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 09-08 16:49:22.351: E/AndroidRuntime(9981): ... еще 11

3 ответа

Ваши журналы ошибок ясно показывают, что происходит

Buffer Error: Error converting result java.lang.NullPointerException

Это означает, что что-то в try блок был null,

    BufferedReader reader = new BufferedReader(new InputStreamReader(
            is, "iso-8859-1"), 8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
    }
    is.close();
    json = sb.toString(); 

Я думаю, это isInputStream

is = httpEntity.getContent();          

Я думаю, что reader.readline() возвращает ноль, поэтому sb не заполнено. Тогда строка 'json' равна нулю, а 'jObj' также равна нулю и возникает проблема. Пожалуйста, убедитесь, что reader.readline() возвращает что-то отличное от null.

Это случилось со мной, когда я программировал программу чтения каналов (не знаю почему), но с этим другим способом это работает, так что вы можете попробовать это:

Вместо:

try {
     BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
     StringBuilder sb = new StringBuilder();
     String line = null;
     while ((line = reader.readLine()) != null) {
        sb.append(line + "\n");
     }
     is.close();
     json = sb.toString();
     ...

Попробуйте сделать так:

try {
     BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
     StringBuilder sb = new StringBuilder();
     String line = null;
     do {
        line = reader.readLine();
        if( line != null)
            sb.append(line + "\n");
     }while (line != null)
     is.close();
     json = sb.toString();
     ...

Сначала попробуйте изменить этот код:

try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");
        }
        is.close();
        json = sb.toString();
    } catch (Exception e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

в это:

try {
    BufferedReader r = new BufferedReader(new InputStreamReader(is));
    String x = "";
    x = r.readLine();
    String total = "";

    while(x!= null){
    total += x;
    x = r.readLine();
    }

    json = total;
    is.close();
} catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

и, пожалуйста, добавьте полную ошибку из журналов.

Другие вопросы по тегам