2012-08-08 78 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. 
} 

我没有时间,但试图给出一个想法。如果你仍然做不到,那我会帮忙。