解析Java中的JSON字符串
我想解析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);
}
}
让我知道什么是我缺少的,为什么我得到这个错误的原因每次运行应用程序。任何意见将不胜感激。
见我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
其实不是一个JSONObject
但JSONArray
。
这里是全工作并经过测试纠正代码:
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
谢谢你。我打开了该链接,但找不到要下载的jar文件。你能否指出我可以从哪里下载它的确切位置? – AKIWEB 2012-08-09 00:09:10
@ Nevzz03试试[here](http://repo1.maven.org/maven2/org/json/json/20090211/json-20090211.jar)。 – oldrinb 2012-08-09 00:10:34
我根据你的建议做了。我也下载了这个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
纠正我,如果我错了,但是JSON是只是文字的分隔“:”,所以只需使用使用st.nextToken(),直到你的数据
String line = ""; //stores the text to parse.
StringTokenizer st = new StringTokenizer(line, ":");
String input1 = st.nextToken();
保持。确保使用“st.hasNextToken()”,这样你就不会得到空的异常。
有关json的信息,请访问http://www.json.org/ – 2012-08-09 00:03:33
OP正在寻找一种以最有效的方式解析json字符串的方法 – 2015-08-27 10:10:12
看起来像你的两个对象(在数组内),你在“经度”之后有一个额外的大括号。
你有一个额外中的每个对象 “}”, 您可以写信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\""
+ " }"
+ " }"
+ " ]"
+ "}";
}
@ Nevzz03您可以使用[link](http://flexjson.sourceforge .net /)flexjson java lib来创建你的json对象。 – 2012-08-09 00:06:40
首先我们有充分的array object
后,一个额外的}
。
其次“地理数据”是JSONArray
。因此,而不是JSONObject geoObject = jObject.getJSONObject("geodata");
,你必须把它作为JSONArray geoObject = jObject.getJSONArray("geodata");
一旦你的JSONArray
您可以获取使用geoObject.get(<index>)
在JSONArray
每个条目。我正在使用org.codehaus.jettison.json
。
下面是一个对象的例子,对于你的情况你必须使用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.
}
我没有时间,但试图给出一个想法。如果你仍然做不到,那我会帮忙。
'android.jar'只包含需要编译的存根。要运行,您需要完整的库。 – oldrinb 2012-08-09 00:01:22
是的,我在我的项目中导入了'android.jar' ..你能指出我从哪里可以下载完整的库吗? – AKIWEB 2012-08-09 00:06:13