2013-04-30 3 views
0

저는 Android에 익숙하지 않습니다. 다음 코드를 사용하여 데이터를 구문 분석하고 데이터베이스에 연결하므로 서버에있는 데이터베이스에 현재 값이 표시됩니다.안드로이드에서 Json을 구현하는 동안 오류가 발생했습니다.

내가 사용하고있는 코드는 다음과 같습니다 -

package com.example.library; 

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.HttpGet; 
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(); 
      HttpGet httpGet = new HttpGet(url); 

      HttpResponse httpResponse = httpClient.execute(httpGet); 
      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();   <------Here 
     } 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; 

    } 
    /* public void writeJSON() { 
      JSONObject object = new JSONObject(); 
      try { 
      object.put("name", "Prathamesh"); 
      object.put("score", new Integer(200)); 
      object.put("current", new Double(152.32)); 
      object.put("nickname", "Programmer"); 
      } catch (JSONException e) { 
      e.printStackTrace(); 
      } 
      System.out.println(object); 
     } 
*/ 
} 

내가 JSON의 값을 사용하여 다음과 같이 it.It가 표시 다른 코드를 사용하고 있습니다 : -

package com.example.library; 

import java.util.ArrayList; 
import java.util.HashMap; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.Bundle; 


public class SecondActivity extends Activity 
{ 

//url to make request 
private static String url = "http://192.168.0.100:3000/users.json"; 

// JSON Node names 
private static final String TAG_ID = "id"; 
private static final String TAG_FIRST = "first_name"; 
private static final String TAG_MIDDLE = "middle_name"; 
private static final String TAG_LAST = "last_name"; 
private static final String TAG_EMAIL = "email"; 
private static final String TAG_ADDRESS = "address"; 
private static final String TAG_MOBILE = "mobile"; 

private static final String TAG_USERS = "user"; 

// users JSONArray 
JSONArray users = null; 



     @Override 

    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tab_test1); 


     // Hashmap for ListView 
      ArrayList<HashMap<String, String>> userList = new ArrayList<HashMap<String, String>>(); 

      // Creating JSON Parser instance 
      JSONParser jParser = new JSONParser(); 

      // getting JSON string from URL 
      JSONObject json = jParser.getJSONFromUrl(url); <---url I am using is http://192.168.0.100:3000/users.json 

      try { 
       // Getting Array of Contacts 
      users = json.getJSONArray(TAG_USERS); 

       // looping through All Contacts 
       for(int i = 0; i < users.length(); i++){ 
        JSONObject c = users.optJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString(TAG_ID); 
        String first = c.getString(TAG_FIRST); 
        String middle = c.getString(TAG_MIDDLE); 
        String last = c.getString(TAG_LAST); 
        String email = c.getString(TAG_EMAIL); 
        String address = c.getString(TAG_ADDRESS); 
        String mobile = c.getString(TAG_MOBILE); 




        // creating new HashMap 

        HashMap<String, String> map = new HashMap<String, String>(); 

        // adding each child node to HashMap key => value 
        map.put(TAG_ID, id); 
        map.put(TAG_FIRST, first); 
        map.put(TAG_MIDDLE,middle); 
        map.put(TAG_LAST, last); 
        map.put(TAG_ADDRESS, address); 
        map.put(TAG_MOBILE, mobile); 
        map.put(TAG_EMAIL, email); 

        // adding HashList to ArrayList 
        userList.add(map); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 

    } 

내 오류 로그 파일은 다음과 같습니다 -

04-30 16:24:05.697: E/AndroidRuntime(687): FATAL EXCEPTION: main 
04-30 16:24:05.697: E/AndroidRuntime(687): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.library/com.example.library.SecondActivity}: java.lang.IllegalArgumentException: HTTP entity may not be null 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.ActivityThread.startActivityNow(ActivityThread.java:1487) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:654) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.widget.TabHost.setCurrentTab(TabHost.java:326) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:132) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:456) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.view.View.performClick(View.java:2485) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.view.View$PerformClick.run(View.java:9080) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.os.Handler.handleCallback(Handler.java:587) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.os.Handler.dispatchMessage(Handler.java:92) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.os.Looper.loop(Looper.java:123) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.ActivityThread.main(ActivityThread.java:3683) 
04-30 16:24:05.697: E/AndroidRuntime(687): at java.lang.reflect.Method.invokeNative(Native Method) 
04-30 16:24:05.697: E/AndroidRuntime(687): at java.lang.reflect.Method.invoke(Method.java:507) 
04-30 16:24:05.697: E/AndroidRuntime(687): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
04-30 16:24:05.697: E/AndroidRuntime(687): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
04-30 16:24:05.697: E/AndroidRuntime(687): at dalvik.system.NativeStart.main(Native Method) 
04-30 16:24:05.697: E/AndroidRuntime(687): Caused by: java.lang.IllegalArgumentException: HTTP entity may not be null 
04-30 16:24:05.697: E/AndroidRuntime(687): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:110) 
04-30 16:24:05.697: E/AndroidRuntime(687): at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146) 
04-30 16:24:05.697: E/AndroidRuntime(687): at com.example.library.JSONParser.getJSONFromUrl(JSONParser.java:55) 
04-30 16:24:05.697: E/AndroidRuntime(687): at com.example.library.SecondActivity.onCreate(SecondActivity.java:51) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-30 16:24:05.697: E/AndroidRuntime(687): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611) 

코드 json = sb.toString();를 사용하는 동안 나는 value.whereas의 JSON이 너무 호출 수입니다 나 두 번째 코드에서 데이터베이스 값. 코드와 아무 잘못이있는 경우

나에게 도움을 알려 주시기 바랍니다

+1

무엇이 오류입니까? 여기에 로그를 입력하십시오 .. –

+0

@ PankajKumar 그런 오류가 없습니다. json = sb.toString(); 따라서 디버거가이 시점에서 멈 춥니 다. – Catmandu

+0

@PeeVee 요청한 URL은 무엇입니까? –

답변

1
String retSrc = EntityUtils.toString(httpEntity); 
      // parsing JSON 
JSONObject json = new JSONObject(retSrc); //Convert String to JSON Object 

대신

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();   <------Here 
    } catch (Exception e) { 
      Log.e("Buffer Error", "Error converting result " + e.toString()); 
    } 

편집 : 나는 당신이 방법은 모양을 aspectin했다 : JSON은 일반적으로 UTF-8에 있어야

public JSONArray getJSONFromUrl(String url) { 
    JSONArray json = null; 
    // Making HTTP request 
    try { 
     // defaultHttpClient 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(url); 

     HttpResponse httpResponse = httpClient.execute(httpGet); 
     if (httpResponse != null && httpResponse.getStatusLine().getStatusCode() == 200) { 
      HttpEntity httpEntity = httpResponse.getEntity(); 
      String retSrc = EntityUtils.toString(httpEntity); 
      // parsing JSON 
      json = new JSONArray(retSrc); //Convert String to JSON Object 
     } 


    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 


    // return JSON String 
    return json; 

} 
+0

이제 null 값 jObj = new JSONObject (json)가 나타납니다. – Catmandu

+0

내가 제공 한 스 니펫에서 json은 이미 JsonObject입니다. "retSrc"의 메시지를 확인할 수 있습니까 – Blackbelt

+0

위의 편집 된 질문을 확인하십시오. Json.java를 변경하면 다른 파일에서 오류가 발생합니다. – Catmandu

0

당신은 또한 사용할 수 있습니다

final String result = EntityUtils.toString(httpEntity); 

대신 :

json = sb.toString(); 
0

내 직감이 charset 잘못이다, 시도 :

BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 1024); 

는 또한 버퍼를 증가 크기는 8에서 1024까지입니다.

+0

이제 null 값 jObj = new JSONObject (json)가 나타납니다. – Catmandu

관련 문제