2012-08-08 163 views
40

我想解析java中的JSON字符串以分別打印各個值。但同時使程序運行我得到以下錯誤 -解析Java中的JSON字符串

Exception in thread "main" java.lang.RuntimeException: Stub! 
     at org.json.JSONObject.<init>(JSONObject.java:7) 
     at ShowActivity.main(ShowActivity.java:29) 

我的類看起來喜歡 -

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

public class ShowActivity { 
    private final static String jString = "{" 
    + " \"geodata\": [" 
    + "  {" 
    + "    \"id\": \"1\"," 
    + "    \"name\": \"Julie Sherman\","     
    + "    \"gender\" : \"female\"," 
    + "    \"latitude\" : \"37.33774833333334\"," 
    + "    \"longitude\" : \"-121.88670166666667\""    
    + "    }" 
    + "  }," 
    + "  {" 
    + "    \"id\": \"2\"," 
    + "    \"name\": \"Johnny Depp\","   
    + "    \"gender\" : \"male\"," 
    + "    \"latitude\" : \"37.336453\"," 
    + "    \"longitude\" : \"-121.884985\""    
    + "    }" 
    + "  }" 
    + " ]" 
    + "}"; 
    private static JSONObject jObject = null; 

    public static void main(String[] args) throws JSONException { 
     jObject = new JSONObject(jString); 
     JSONObject geoObject = jObject.getJSONObject("geodata"); 

     String geoId = geoObject.getString("id"); 
      System.out.println(geoId); 

     String name = geoObject.getString("name"); 
     System.out.println(name); 

     String gender=geoObject.getString("gender"); 
     System.out.println(gender); 

     String lat=geoObject.getString("latitude"); 
     System.out.println(lat); 

     String longit =geoObject.getString("longitude"); 
     System.out.println(longit);     
    } 
} 

讓我知道什麼是我缺少的,爲什麼我得到這個錯誤的原因每次運行應用程序。任何意見將不勝感激。

+2

'android.jar'只包含需要編譯的存根。要運行,您需要完整的庫。 – oldrinb 2012-08-09 00:01:22

+0

是的,我在我的項目中導入了'android.jar' ..你能指出我從哪裏可以下載完整的庫嗎? – AKIWEB 2012-08-09 00:06:13

回答

55

見我comment。 你需要包含完整的org.json library當作爲運行時android.jar只包含需要編譯的存根。

此外,您必須在longitude之後刪除JSON數據中額外的}這兩個實例。

private final static String JSON_DATA = 
    "{" 
    + " \"geodata\": [" 
    + " {" 
    + "  \"id\": \"1\"," 
    + "  \"name\": \"Julie Sherman\","     
    + "  \"gender\" : \"female\"," 
    + "  \"latitude\" : \"37.33774833333334\"," 
    + "  \"longitude\" : \"-121.88670166666667\"" 
    + " }," 
    + " {" 
    + "  \"id\": \"2\"," 
    + "  \"name\": \"Johnny Depp\","   
    + "  \"gender\" : \"male\"," 
    + "  \"latitude\" : \"37.336453\"," 
    + "  \"longitude\" : \"-121.884985\"" 
    + " }" 
    + " ]" 
    + "}"; 

除此之外,geodata其實不是一個JSONObjectJSONArray

這裏是全工作並經過測試糾正代碼:

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

public class ShowActivity { 


    private final static String JSON_DATA = 
    "{" 
    + " \"geodata\": [" 
    + " {" 
    + "  \"id\": \"1\"," 
    + "  \"name\": \"Julie Sherman\","     
    + "  \"gender\" : \"female\"," 
    + "  \"latitude\" : \"37.33774833333334\"," 
    + "  \"longitude\" : \"-121.88670166666667\"" 
    + " }," 
    + " {" 
    + "  \"id\": \"2\"," 
    + "  \"name\": \"Johnny Depp\","   
    + "  \"gender\" : \"male\"," 
    + "  \"latitude\" : \"37.336453\"," 
    + "  \"longitude\" : \"-121.884985\"" 
    + " }" 
    + " ]" 
    + "}"; 

    public static void main(final String[] argv) throws JSONException { 
    final JSONObject obj = new JSONObject(JSON_DATA); 
    final JSONArray geodata = obj.getJSONArray("geodata"); 
    final int n = geodata.length(); 
    for (int i = 0; i < n; ++i) { 
     final JSONObject person = geodata.getJSONObject(i); 
     System.out.println(person.getInt("id")); 
     System.out.println(person.getString("name")); 
     System.out.println(person.getString("gender")); 
     System.out.println(person.getDouble("latitude")); 
     System.out.println(person.getDouble("longitude")); 
    } 
    } 
} 

下面是輸出:

C:\dev\scrap>java -cp json.jar;. ShowActivity 
1 
Julie Sherman 
female 
37.33774833333334 
-121.88670166666667 
2 
Johnny Depp 
male 
37.336453 
-121.884985 
+0

謝謝你。我打開了該鏈接,但找不到要下載的jar文件。你能否指出我可以從哪裏下載它的確切位置? – AKIWEB 2012-08-09 00:09:10

+3

@ Nevzz03試試[here](http://repo1.maven.org/maven2/org/json/json/20090211/json-20090211.jar)。 – oldrinb 2012-08-09 00:10:34

+0

我根據你的建議做了。我也下載了這個jar,也導入到我們的項目中。當我運行我的項目時,我得到異常 - 「線程異常」主「org.json.JSONException:JSONObject [」geodata「]不是JSONObject。 \t at org.json.JSONObject.getJSONObject(JSONObject.java:596) \t at com.niharika.testing.JsonTest.main(JsonTest.java:31) '任何想法將不勝感激。 – AKIWEB 2012-08-09 00:19:36

-2

糾正我,如果我錯了,但是JSON是隻是文字的分隔「:」,所以只需使用使用st.nextToken(),直到你的數據

String line = ""; //stores the text to parse. 

StringTokenizer st = new StringTokenizer(line, ":"); 
String input1 = st.nextToken(); 

保持。確保使用「st.hasNextToken()」,這樣你就不會得到空的異常。

+2

有關json的信息,請訪問http://www.json.org/ – 2012-08-09 00:03:33

+0

OP正在尋找一種以最有效的方式解析json字符串的方法 – 2015-08-27 10:10:12

3

看起來像你的兩個對象(在數組內),你在「經度」之後有一個額外的大括號。

0

你有一個額外中的每個對象 「}」, 您可以寫信JSON字符串是這樣的:

public class ShowActivity { 
    private final static String jString = "{" 
    + " \"geodata\": [" 
    + "  {" 
    + "    \"id\": \"1\"," 
    + "    \"name\": \"Julie Sherman\","     
    + "    \"gender\" : \"female\"," 
    + "    \"latitude\" : \"37.33774833333334\"," 
    + "    \"longitude\" : \"-121.88670166666667\""    
    + "    }" 
    + "  }," 
    + "  {" 
    + "    \"id\": \"2\"," 
    + "    \"name\": \"Johnny Depp\","   
    + "    \"gender\" : \"male\"," 
    + "    \"latitude\" : \"37.336453\"," 
    + "    \"longitude\" : \"-121.884985\""    
    + "    }" 
    + "  }" 
    + " ]" 
    + "}"; 
} 
+0

@ Nevzz03您可以使用[link](http://flexjson.sourceforge .net /)flexjson java lib來創建你的json對象。 – 2012-08-09 00:06:40

1

首先我們有充分的array object後,一個額外的}

其次「地理數據」是JSONArray。因此,而不是JSONObject geoObject = jObject.getJSONObject("geodata");,你必須把它作爲JSONArray geoObject = jObject.getJSONArray("geodata");

一旦你的JSONArray您可以獲取使用geoObject.get(<index>)JSONArray每個條目。我正在使用org.codehaus.jettison.json

0

下面是一個對象的例子,對於你的情況你必須使用JSONArray。

public static final String JSON_STRING="{\"employee\":{\"name\":\"Sachin\",\"salary\":56000}}"; 
try{ 
    JSONObject emp=(new JSONObject(JSON_STRING)).getJSONObject("employee"); 
    String empname=emp.getString("name"); 
    int empsalary=emp.getInt("salary"); 

    String str="Employee Name:"+empname+"\n"+"Employee Salary:"+empsalary; 
    textView1.setText(str); 

}catch (Exception e) {e.printStackTrace();} 
    //Do when JSON has problem. 
} 

我沒有時間,但試圖給出一個想法。如果你仍然做不到,那我會幫忙。