2011-09-28 185 views
0

我想插入一些項目到數據庫中。在主要活動中,我從用戶獲取信息並將其傳遞給另一個類來進行解析。我的JSONObject不斷顯示爲NULL。JSON對象返回一個空指針

如果我不清楚這個問題,我很抱歉。我試圖儘可能地解釋它。

下面是代碼的輸入,歡迎

public class MainActivity extends Activity { 
/** THE FOLLOWING STRINGS WILL BE DISPLAYED IN LOGCAT */ 

final String TAG = "########-------MAIN ACTIVITY: LOGIN--------######"; 
final String URL = "http://46.51.193.32/timereport/ses/sessions"; 
UserHelper userAdapter; 
UserHelper db; 
EditText edit_password,edit_username,edit_company; 
String regName; 
int duration = Toast.LENGTH_LONG; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    db = new UserHelper(this); 
    userAdapter = new UserHelper(this); 
    edit_password = (EditText)findViewById(R.id.password); 
    edit_username = (EditText)findViewById(R.id.user_name); 
    edit_company = (EditText)findViewById(R.id.company_string); 
    Button login = (Button)findViewById(R.id.login_button); 
    login.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      JSONObject jsonobj = new JSONObject(); 
      try{ 

       JSONObject subJson = new JSONObject(); 
       subJson.put("username", edit_username.getText().toString()); 
       subJson.put("password", edit_password.getText().toString()); 
       subJson.put("company", edit_company.getText().toString()); 
       jsonobj.put("user", subJson); 
      } 
      catch(JSONException e) { 
       Log.i("","#####-----error at catch jsonexception-----#####"); 

      } 
HandleJSON.SendHttpPost(URL, jsonobj); 
       String regNameSplit[] = regName.split("-"); 
      try{ 
       userAdapter.openDatabase(); 
       long id = db.insertIntoDatabase(edit_username.getText().toString(),edit_company.getText().toString(), edit_password.getText().toString(),regNameSplit[0], regNameSplit[2]); 
       Toast.makeText(getApplicationContext(), "You have successfully logged in as: " +"\n" +regNameSplit[0], duration).show(); 
       Log.i(TAG, "Printing value of id which will be inserted only to remove warnings "+id); 
       userAdapter.closeDatabase(); 
      } 
      catch(SQLiteException e){ 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

}

這是我要打發JSON對象類來解析

public class HandleJSON{ 

UserHelper userAdapter; 
private static final String TAG = "&&----HTTPClient-----**"; 
public static String SendHttpPost (String URL, JSONObject jsonobj) { 
String regName = ""; 

try{  

     Log.v("Json object request is ",jsonobj.toString()); 
     DefaultHttpClient httpClientInstance = GetHttpClient.getHttpClientInstance(); 
     HttpPost httpPostRequest = new HttpPost(URL); 
     Log.v(TAG,"The url is "+URL); 

     StringEntity se; 
     se = new StringEntity(jsonobj.toString()); 

     httpPostRequest.setEntity(se); 
     httpPostRequest.setHeader("Accept", "application/json"); 
     httpPostRequest.setHeader("Content-type", "application/json"); 

     long t = System.currentTimeMillis(); 
     HttpResponse response = (HttpResponse) httpClientInstance.execute(httpPostRequest); 
     Log.i(TAG, "HTTPRESPONSE RECIEVED" +(System.currentTimeMillis()-t) + "ms"); 

      String resultString = convertStreamToString(response.getEntity().getContent()); 
      Log.v(TAG , "The response is " +resultString); 
      JSONObject jsonObj = new JSONObject(resultString); 
      JSONObject sessionJson = jsonObj.getJSONObject("session"); 
      String sessionId = sessionJson.getString("sessionid"); 
      String name = sessionJson.getString("name"); 
      Log.v(TAG,"The session ID is "+sessionId); 
      Log.v(TAG,"The name is "+name); 
      regName = name+"-"+sessionId+"-"+URL; 

} catch (Exception e){ 
    e.printStackTrace(); 
} 
return regName; 
} 

private static String convertStreamToString(InputStream is) { 

BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
StringBuilder sb = new StringBuilder(); 

String line = null; 
try{ 
    while((line = reader.readLine()) !=null){ 
     sb.append(line + "\n"); 
    } 
} 
    catch (IOException e){ 
     e.printStackTrace(); 
    } finally{ 
     try { 
      is.close(); 
     } catch (IOException e){ 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 
} 
} 

我剛添加了一些在MainActivity中丟失的代碼,

String regNameSplit[] = regName.split("-"); 

一直顯示爲空

+0

嘗試打印json字符串之前,HandleJSON.SendHttpPost(URL,jsonobj); ,我想你可能會遇到異常,在這種情況下,jsonobj將爲空。 –

+0

通過「保持顯示爲NULL」,你的意思是'SendHttpPost'內的jsonobj參數是否爲空?順便說一句'Log.v(「Json對象請求是」,jsonobj.toString());'看起來有點奇怪你的意思Log.v(「Json對象請求是」+ jsonobj.toString());'? –

+0

他可能是指'Log.v(TAG,「Json對象請求是」+ jsonobj);' –

回答

1

我看不出有什麼錯有了這個,你能告訴我什麼是regna的用法我 ?

你mainactivity只是改變了以下內容:

regname = HandleJSON.SendHttpPost(URL, jsonobj); 

你不回撥寄存器名被分配到名稱和會話ID,你是在sendhttppost返回。

2
  1. 而不是你convertStreamToString()方法嘗試使用系統提供的EntityUtils.toString(entity)

  2. 重要提示:不要捕獲通用Exception,這會隱藏未檢查(運行時)異常。您可能會隱藏發生在JSONObject constructor中的JSONException

更新:

要調用SendHttpPost,而不是歸屬結果變量:

HandleJSON.SendHttpPost(URL, jsonobj); 

應該是:

regName = HandleJSON.SendHttpPost(URL, jsonobj); 
+1

......並且當日志記錄如Android的Log類中那樣隨時可用時,千萬不要'printStackTrace()'。 'printStackTrace()'切斷了堆棧的痕跡,並且具有將它完成到完全有趣的部分的天賦。 –