2013-03-18 75 views
4

你好,我試圖從我的jsonString中獲取一個對象時,我總是得到NPE。我嘗試了很多的東西,甚至改變了我的json一羣人,但它只是不工作。 HTTPResponse工作正常,當我登錄「myObject」時,它給出了正確的對象。但是當我試圖獲得它的對象時,它給了我一個NPE。我測試了json,它是有效的。我也嘗試檢索一個數組而不是一個對象,但它也給出了一個NPE。有人可以告訴我如何解決這個問題。nullpointerexception當試圖從json字符串獲取json數組或json對象

我做了一個簡單的jsontester活動來測試我的JSON:

public class JSONTester extends Activity { 

private DefaultHttpClient createHttpClient() { 
    HttpParams my_httpParams = new BasicHttpParams(); 
    HttpConnectionParams.setConnectionTimeout(my_httpParams, 3000); 
    SchemeRegistry registry = new SchemeRegistry(); 
    registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
    ThreadSafeClientConnManager multiThreadedConnectionManager = new ThreadSafeClientConnManager(my_httpParams, registry); 
    DefaultHttpClient httpclient = new DefaultHttpClient(multiThreadedConnectionManager, my_httpParams); 
    return httpclient; 
} 

MikeyJSON mJSON; 

Button mBtnGo; 
TextView mTxt1; 
TextView mTxt2; 
TextView mTxt3; 
TextView mTxt4; 
ProgressDialog mProgressDialog; 
private String lang;   
private int length;  // 0 - 6 (length 7 to length 12) 
private int wordPos;  // 0 - array length 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_jsontester); 

    mTxt1 = (TextView) findViewById(R.id.txt1); 
    mTxt1 = (TextView) findViewById(R.id.txt1); 
    mTxt1 = (TextView) findViewById(R.id.txt1); 
    mTxt1 = (TextView) findViewById(R.id.txt1); 
    mBtnGo = (Button) findViewById(R.id.btnGo); 

} 

public boolean isNumeric(String str) { 

    for(int i=0;i<str.length();i++) { 

     if(Character.isDigit(str.charAt(i))) { 
      return true; 
     } 
    } 
    return false; 
} 

public void testJSON(View view) { 
    if(view==mBtnGo) { 

     mProgressDialog = new ProgressDialog(this); 
     mProgressDialog.setMessage("loading"); 
     mProgressDialog.show(); 
     new DownloadNewWords().execute(); 
    } 

} 
private class DownloadNewWords extends AsyncTask<Void, Void, Void> { 

    int mStatusCode = 0; 
    String mResultString; 
    Exception mConnectionException; 

    @Override 
    protected Void doInBackground(Void... args) { 

      String fetchUrl = "http://www.mikeywebs.nl/json/jsonexample.html"; 
      DefaultHttpClient httpclient = createHttpClient(); 
     HttpGet httpget = new HttpGet(fetchUrl); 

     try { 
      HttpResponse response = httpclient.execute(httpget); 
      StatusLine statusLine = response.getStatusLine(); 
      mStatusCode = statusLine.getStatusCode(); 
       if (mStatusCode == 200){ 
       mResultString = EntityUtils.toString(response.getEntity()); 
      } 
     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
      mConnectionException = e; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      mConnectionException = e; 
     } 
     return null;    
    } 

     @Override 
    protected void onPostExecute(Void arg) { 
     mProgressDialog.dismiss(); 
     if (mStatusCode == 200){ 
      mJSON = new MikeyJSON(mResultString); 
      lang = "English"; //Integer.parseInt(langu); 
      length = 7; //Integer.parseInt(wordl); 
      wordPos = 0; 
      String getWord = mJSON.getResult(lang, length, wordPos); 
      mTxt4.setText(getWord); 

     } 
     else { 
      Toast.makeText(JSONTester.this, "Gegevens konden niet worden opgehaald. Controleer uw internetverbinding en probeer het opnieuw (" +mConnectionException.toString() + ")" , Toast.LENGTH_LONG).show(); 
      mJSON = null; 
     } 
    } 
} 

} 

,而且我用jsonclass是:

public class MikeyJSON { 

private JSONObject myObject; 
private JSONArray jsonArray; 

int i; 


public MikeyJSON(String jsonString) { 
    Log.i("JSON", "jsonString: " + jsonString); 
    try { 
     JSONObject myObject = new JSONObject(jsonString); 
     Log.i("JSON", "myObject_Object: " + myObject.toString()); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

} 

public String getResult(String lang, int length, int wordPos) { 
    String word = "0"; 
    //0 is Nederlands 1 is English 
    int la = 0; 
    if(lang.equals("English")) { 
     la = 1; 
    } 
    //make String length 
    String le = "length" + Integer.toString(length); 
    Log.i("PARSE", "get_length: " + le); 

    //the json 
    try { 
     jsonArray = myObject.getJSONArray("galgjejson"); 
     Log.i("JSON", "jsonArray: " + jsonArray.toString()); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return word;   
} 
} 

這裏是JSON:

{ "galgjejson" : [ 
       { "Nederlands" : [ 
             { "length7" : [ 
                  { "word" : "android" }, 
                  { "word" : "camping" }, 
                  { "word" : "koekjes" } 
                 ] 
             } 
           ] 
       }, 
       { "English" : [ 
             { "length7" : [ 
                  { "word" : "android" }, 
                  { "word" : "camping" }, 
                  { "word" : "koekjes" } 
                 ] 
             } 
           ] 
       }    
      ]            
} 

這裏是日誌:

03-18 14:06:23.178: I/JSON(6719): myObject_Object: {"Nederlands":[{"length7": 
[{"word":"android"},{"word":"camping"},{"word":"koekjes"}]}]} 
03-18 14:06:23.178: I/PARSE(6719): get_length: length7 
03-18 14:06:23.178: D/AndroidRuntime(6719): Shutting down VM 
03-18 14:06:23.178: W/dalvikvm(6719): threadid=1: thread exiting with uncaught exception (group=0x40a13300) 
03-18 14:06:23.207: E/AndroidRuntime(6719): FATAL EXCEPTION: main 
03-18 14:06:23.207: E/AndroidRuntime(6719): java.lang.NullPointerException 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at me.mikey.my.games.galgjex.MikeyJSON.<init>(MikeyJSON.java:38) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at me.mikey.my.games.galgjex.JSONTester$DownloadNewWords.onPostExecute(JSONTester.java:128) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at me.mikey.my.games.galgjex.JSONTester$DownloadNewWords.onPostExecute(JSONTester.java:1) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at android.os.AsyncTask.finish(AsyncTask.java:631) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at android.os.AsyncTask.access$600(AsyncTask.java:177) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at android.os.Handler.dispatchMessage(Handler.java:99) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at android.os.Looper.loop(Looper.java:137) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at java.lang.reflect.Method.invokeNative(Native Method) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at java.lang.reflect.Method.invoke(Method.java:511) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
03-18 14:06:23.207: E/AndroidRuntime(6719):  at dalvik.system.NativeStart.main(Native Method) 

哦和線路38:

jsonArray = myObject.getJSONArray("galgjejson"); 
+3

多德。如果我們沒有給你正確的答案,請更改舊的問題,或編輯它來更新。不要重新發布確切的事情,因爲否則,沒有看到第一個結果的人會將其視爲重複結果。至少,如果您*要*想要開新的問題,請在我們的舊帖子中標記我們的帖子之一作爲答案 – 2013-03-18 14:34:09

回答

1

myObject是最有可能無效,因爲你必須在你的類,然後私下內mikeyJSON。你應該嘗試:

private JSONObject myObject; 
private JSONArray jsonArray; 

int i; 


public MikeyJSON(String jsonString) { 
Log.i("JSON", "jsonString: " + jsonString); 
try { 
    myObject = new JSONObject(jsonString); 
    Log.i("JSON", "myObject_Object: " + myObject.toString()); 
} catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

} 

望着那JSON我敢肯定,你可以使用字符串在構造函數,而不是一個JSONObject創建JSONArray。

編輯示例。

private JSONArray jsonArray; 

int i; 

public MikeyJSON(String jsonString) { 
try { 
    jsonArray = new JSONArray(jsonString); 
} catch (JSONException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

} 
+0

適合變量的範圍! – 2013-03-18 14:40:26

0

作爲你的logcat的第一行示出了:

03-18 14:06:23.178:I/JSON(6719):myObject_Object:{ 「荷蘭」:[{ 「length7」 : [{ 「詞」: 「機器人」},{ 「字」: 「露營」},{ 「字」: 「koekjes」}]}]}

在這一點上,你已經有了JSONArray標記爲「galgjejson」,因此您需要改爲將第38行更改爲:

jsonArray = myObject.getJSONArray(「Nederlands」);

這將讓你的下一個JSONArray處理