2014-01-22 3 views
-3

Я по-прежнему новичок в веб-сервисе Android, теперь у меня проблема с обработкой данных json из url.JSON Parsing Android

вот мой код: JSONParser.java

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.util.Log; 
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(); 
     HttpPost httpPost = new HttpPost(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, "UTF-8"), 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; 
} 
}  

здесь мой MainActivity.java

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.app.Activity; 
import android.os.Bundle; 
import android.widget.TextView; 
import learn2crack.jsonparsing.library.JSONParser; 
public class MainActivity extends Activity { 
//URL to get JSON Array 
private static String url = "https://api.themoviedb.org/3/genre/list?api_key=d397dd2d354f088c6f0eb91c6b160bb0"; 
//JSON Node Names 
private static final String TAG_GENRES = "genres"; 
private static final String TAG_ID = "id"; 
private static final String TAG_NAME = "name"; 

JSONArray genres = null; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    // Creating new JSON Parser 
    JSONParser jParser = new JSONParser(); 
    // Getting JSON from URL 
    JSONObject json = jParser.getJSONFromUrl(url); 
    try { 
     // Getting JSON Array 
     genres = json.getJSONArray(TAG_GENRES); 
     JSONObject c = genres.getJSONObject(0); 
     // Storing JSON item in a Variable 
     String id = c.getString(TAG_ID); 
     String name = c.getString(TAG_NAME); 

     //Importing TextView 
     final TextView uid = (TextView)findViewById(R.id.uid); 
     final TextView name1 = (TextView)findViewById(R.id.name); 

     //Set JSON Data in TextView 
     uid.setText(id); 
     name1.setText(name); 

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

, но я получаю сообщение об ошибке в LogCat, как показано ниже

01-22 10:36:09.701: E/JSON Parser(379): Error parsing data org.json.JSONException: Value <h1>Not of type java.lang.String cannot be converted to JSONObject 
01-22 10:36:09.721: E/AndroidRuntime(379): FATAL EXCEPTION: main 
01-22 10:36:09.721: E/AndroidRuntime(379): java.lang.RuntimeException: Unable to start activity ComponentInfo{learn2crack.jsonparsing/learn2crack.jsonparsing.MainActivity}: java.lang.NullPointerException 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.ActivityThread.access$1500(ActivityThread.java:117) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.os.Handler.dispatchMessage(Handler.java:99) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.os.Looper.loop(Looper.java:130) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.ActivityThread.main(ActivityThread.java:3683) 
01-22 10:36:09.721: E/AndroidRuntime(379): at java.lang.reflect.Method.invokeNative(Native Method) 
01-22 10:36:09.721: E/AndroidRuntime(379): at java.lang.reflect.Method.invoke(Method.java:507) 
01-22 10:36:09.721: E/AndroidRuntime(379): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
01-22 10:36:09.721: E/AndroidRuntime(379): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
01-22 10:36:09.721: E/AndroidRuntime(379): at dalvik.system.NativeStart.main(Native Method) 
01-22 10:36:09.721: E/AndroidRuntime(379): Caused by: java.lang.NullPointerException 
01-22 10:36:09.721: E/AndroidRuntime(379): at learn2crack.jsonparsing.MainActivity.onCreate(MainActivity.java:29) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
01-22 10:36:09.721: E/AndroidRuntime(379): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 

здесь мои json данные

{"genres":[{"id":28,"name":"Action"},{"id":12,"name":"Adventure"},{"id":16,"name":"Animation"},{"id":35,"name":"Comedy"},{"id":80,"name":"Crime"},{"id":105,"name":"Disaster"},{"id":99,"name":"Documentary"},{"id":18,"name":"Drama"},{"id":82,"name":"Eastern"},{"id":2916,"name":"Erotic"},{"id":10751,"name":"Family"},{"id":10750,"name":"Fan Film"},{"id":14,"name":"Fantasy"},{"id":10753,"name":"Film Noir"},{"id":10769,"name":"Foreign"},{"id":36,"name":"History"},{"id":10595,"name":"Holiday"},{"id":27,"name":"Horror"},{"id":10756,"name":"Indie"},{"id":10402,"name":"Music"},{"id":22,"name":"Musical"},{"id":9648,"name":"Mystery"},{"id":10754,"name":"Neo-noir"},{"id":1115,"name":"Road Movie"},{"id":10749,"name":"Romance"},{"id":878,"name":"Science Fiction"},{"id":10755,"name":"Short"},{"id":9805,"name":"Sport"},{"id":10758,"name":"Sporting Event"},{"id":10757,"name":"Sports Film"},{"id":10748,"name":"Suspense"},{"id":10770,"name":"TV movie"},{"id":53,"name":"Thriller"},{"id":10752,"name":"War"},{"id":37,"name":"Western"}]} 

Я все еще смущен вышеуказанным решением, любой может помочь?

+2

который ваша 29-я линия в основной деятельности? – rup35h

+0

Поместите его в нить. – Kishan

+0

@ user3197499 Я полностью обескуражен, отвечая на ваш вопрос, потому что так много ответов имеют пониженное голосование.Этот ящик слишком мал, чтобы обсудить все ваши проблемы: вы уверены, что ваш JSONObject 'json' не является нулевым? Вы действительно хотите иметь длинный сетевой запрос на свой основной поток? Android это не нравится. PS - «спасибо брату». – SK9

ответ

2
HttpGet httpPost = new HttpGet(url); 
+0

спасибо брату .. – user3197499

+0

, пожалуйста, повысьте и отметьте как ri8 –

1

JSON, о котором вы утверждаете, что синтаксический анализ не является тем, что вы анализируете.

Вы получаете исключение от jObj = new JSONObject(json); и запишите его; он говорит вам, что есть <h1> в начале строки, которую вы пытаетесь проанализировать. Затем вы возвращаете jObj, который по-прежнему null, поэтому ваше приложение выходит с NullPointerException, когда вы пытаетесь его использовать.

Это вызвано тем, что вы делаете POST на сервер:

HttpPost httpPost = new HttpPost(url); 

который, если вы должны были распечатать результаты, которые вы хотите найти возвращается:

<h1>Not Found</h1> 

Вы должны делать GET

HttpGet httpGet = new HttpGet(url); 

Это всегда аг ood идея проверить ваши входы при попытке отладки чего-то.

+0

Вверх проголосовал за свое сообщение перед тем, как ОН отдал голоса из-за невежества. (И потому, что это полностью правильно.) – SK9

+0

@ SK9 Я ухожу на пару часов и, видимо, пропустил всю забаву/драму? –

+0

@Brian Roach у вас есть исходный код решения для анализа json-данных для этого URL-адреса http://api.themoviedb.org/3/genre/18/movies?api_key=d397dd2d354f088c6f0eb91c6b160bb0. Я стараюсь, но не реагирую на эмулятор. – user3197499

0

Кажется, что вы размещаете длительный процесс, то есть сетевую связь на основной теме. Вам не разрешено это делать. Вы можете использовать AsyncTask

http://developer.android.com/reference/android/os/AsyncTask.html 

Кроме того, здесь хорошее видео, которое объясняет JSON Синтаксического с помощью AsyncTask.

http://www.youtube.com/watch?v=qcotbMLjlA4 

Для тестирования вы можете добавить следующее в свою основную деятельность, но это считается плохой практикой.

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
StrictMode.setThreadPolicy(policy); 
+1

Могу ли я узнать, почему голосование идет вниз? –

+0

спасибо брату. – user3197499

+1

@ user3197499 Хотя это не отвечает на вопрос OP, оно дает надежные советы. – SK9

0

Ваш объект JSON возвращается 'пустой', поэтому вы получаете NullPointer exception.You должны использовать "GET" вместо "POST" .Try этот код

public JSONObject getJSONFromUrl(String jurl) { 
    // Making HTTP request 


    String marketUrl =jurl;    
    URL url;     
    try { 
      url = new URL(marketUrl); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setReadTimeout(10000); 
      conn.setConnectTimeout(15000); 
      conn.setRequestMethod("GET"); 
      conn.setRequestProperty("Content-length", "0"); 
      conn.setAllowUserInteraction(false); 
      // Starts the query 
      conn.connect(); 
      int status = conn.getResponseCode(); 
      StringBuilder sb = new StringBuilder(); 
      switch (status) { 
      case 200: 
      case 201: 
       BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
       String line; 
       while ((line = br.readLine()) != null) { 
        sb.append(line+"\n"); 
       } 
       br.close(); 
       String responseData = sb.toString();  
       jObj = new JSONObject(responseData); 
    } 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    return jObj; 
} 
}  
+0

спасибо брат .. – user3197499