如何使用Json解析器android?

问题描述:

我使用下面给出的解析器和一个示例Android 2.2。我的例子是工作,我没有问题。当试图在使用Android 4.3的项目中使用某个示例时。但我的解析器行有问题如何使用Json解析器android?

HttpResponse httpResponse = httpClient.execute(httpPost); 

我检查了我的清单中的所有权限,所有这些权限都被使用。

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 
      Log.d("test url" , "le request est lancé") ; 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url); 
      HttpResponse httpResponse = httpClient.execute(httpPost); 
      Log.d("test url" , "la connection etablie"); 
      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; 

    } 
} 

日志是:

11-14 10:48:38.590: ERROR/AndroidRuntime(3801): FATAL EXCEPTION: main 
     java.lang.RuntimeException: Unable to start activity ComponentInfo{fr.web.tab/fr.web.profilconfiguration.AndroidJSONParsingActivity}: android.os.NetworkOnMainThreadException 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
     at android.app.ActivityThread.access$600(ActivityThread.java:123) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:4424) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:511) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
     at dalvik.system.NativeStart.main(Native Method) 
     Caused by: android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
     at java.net.InetAddress.lookupHostByName(InetAddress.java:391) 
     at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242) 
     at java.net.InetAddress.getAllByName(InetAddress.java:220) 
     at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
     at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
     at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
     at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
     at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
     at fr.web.profilconfiguration.JSONParser.getJSONFromUrl(JSONParser.java:44) 
     at fr.web.profilconfiguration.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:62) 
     at android.app.Activity.performCreate(Activity.java:4465) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920) 
+0

具有u使用网络许可清单文件? – Ruban

+0

可能重复的[android.os.NetworkOnMainThreadException](http://*.com/questions/6343166/android-os-networkonmainthreadexception) – laalto

您正在主线程中执行网络工作,以解决此错误的原因。 开发过程你使用这个,但不是生活的应用程序。

把这个代码在onCreate方法的活动后的setContentView(布局)

if (android.os.Build.VERSION.SDK_INT > 9) { 
     StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
       .permitAll().build(); 
     StrictMode.setThreadPolicy(policy); 
    } 
+0

http://blog.vogella.com/2011/04/04/android-strictmode/。 StrictMode只能在开发过程中使用,而不能在实时应用程序中使用。 http://developer.android.com/reference/android/os/StrictMode.html。所以我想知道这是一个解决方案如何将代码移动到线程 – Raghunandan

+1

这是一个非常糟糕的回答这个问题。 – cbrulak

Caused by: android.os.NetworkOnMainThreadException 

您正在运行的网络realted在UI线程上运行。

HttpResponse httpResponse = httpClient.execute(httpPost); 

上述声明必须在thread或的AsyncTask doInbackground。在UI线程上

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

调用的AsyncTask new TheTask().execute()

class TheTask extends AsyncTask<Void ,Void, Void>{ 

     @Override 
     protected Void doInBackground(Void... params) { 
        JSONObject jobject =getJSONFromUrl(String url); 
      return null; 

     } 
    } 
+0

你能解释更多吗?在我的解析器中,params是什么? – user2043602

+0

这是VAR args谷歌相同。那就是asynctask的doinbackground并将你的网络相关代码移到doinbackground。 – Raghunandan

+0

@ user2043602是什么让你认为接受的答案是解决方案请看看这里http://developer.android.com/reference/android/os/StrictMode.html – Raghunandan

Caused by: android.os.NetworkOnMainThreadException 

不能在主线程中使用HttpResponse。您必须使用从Web获得Json的AsyncTask

阅读此内容;

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

public static JSONObject responseForSignin(final String uname,final String pwd) { 

     JSONObject jsonResponse = null; 
     HttpParams httpParameters = new BasicHttpParams(); 
     int connectionTimeout = 1000*12; 
     int socketTimeout = 1000*13; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, connectionTimeout); 
     HttpConnectionParams.setSoTimeout(httpParameters, socketTimeout); 
     // Create a new HttpClient and Post Header 
     HttpClient httpClient = new DefaultHttpClient(httpParameters); 
     HttpPost httpPost = new HttpPost("URL"); 
     httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded"); 

     try { 
      // Add your data 

      List<NameValuePair> signinDetails = new ArrayList<NameValuePair>(); 
      signinDetails.add(new BasicNameValuePair("name", uname)); 
         signinDetails.add(new BasicNameValuePair("pwd", pwd)); 
      httpPost.setEntity(new UrlEncodedFormEntity(signinDetails)); 
      // Execute HTTP Post Request 
      HttpResponse httpResponse = httpClient.execute(httpPost); 
      Log.v("Post Status", "Code: "+ httpResponse.getStatusLine().getStatusCode()); 
      responseCode = httpResponse.getStatusLine().getStatusCode(); 
       Log.e("responseCode", String.valueOf("response code"+responseCode)); 
       HttpEntity entity = httpResponse.getEntity(); 
       Log.e("entity", String.valueOf(entity)); 
       if (entity != null) { 

        if (entity != null) { 

         String responseBody = EntityUtils.toString(entity); 
         JSONTokener jsonTokener = new JSONTokener(responseBody); 
         jsonResponse = new JSONObject(jsonTokener); 
         JSONObject response = jsonResponse.getJSONObject("response"); 
         // Getting String inside response object 
         String status = response.getString("status"); 
         String message = response.getString("message"); 

        } 
       } // if (entity != null) end 
     } 

     catch (SocketException seExp) 
     { 

     } 
     catch (ConnectTimeoutException cteExp) 
     { 
     // TODO Auto-generated catch block 

     } 
     catch (ClientProtocolException cpeExp) { 
      // TODO Auto-generated catch block 
     } 

      catch (UnknownHostException e) { 
       // TODO Auto-generated catch block 

       e.printStackTrace(); 
      } 
     catch (Exception allExp) { 
      // TODO Auto-generated catch block 
     }  
     return jsonResponse; 
    } 

试试这个

public class RequestLogInFromServer extends AsyncTask<Object, Object, Object> 
    { 

     private ProgressDialog progressDialog; 


     @Override 
     protected Object doInBackground(Object... params) 
     { 

        try { 

         JSONObject subscriptionResponse = CommonJsonParser.responseForSignin(uname, pwd).getJSONObject("response"); 

         if (!(subscriptionResponse.equals(null))||!(subscriptionResponse.equals(""))) {      


         } 


        } 



        catch (NullPointerException e) { 
         // TODO Auto-generated catch block 


        } 


        catch (JSONException e) { 
         // TODO Auto-generated catch block 
        } 


        catch (Exception e) { 
         // TODO Auto-generated catch block 
        } 

      return null; 

     } 


     @Override 
     protected void onPostExecute(Object result) 
     {  
      if(progressDialog!=null){ 
      progressDialog.dismiss(); 
      }  

      super.onPostExecute(result); 
     } 

     @Override 
     protected void onPreExecute() { 

      progressDialog = ProgressDialog.show(SignInActivity.this, "", "Please wait"); 
      super.onPreExecute(); 
     } 

    } 

使用AsyncTask.any服务器请求,或需要很长的时间应在后台任务被写

不使用主线程中的网络活动。仅针对应用程序引发此异常定位到Honeycomb SDK或更高版本。在单独的线程中执行所有与网络有关的任务。你的问题将得到解决。