Синтаксический анализ данных 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();
Я думаю, это is
InputStream
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());
}
и, пожалуйста, добавьте полную ошибку из журналов.