以下是我的代码。它在模拟器上工作正常。但是当我在我的Android设备上运行它时,它崩溃了java.lang.ClassCastException:java.lang.String在下面标记的行。我找不到铸件出错的地方。任何帮助将不胜感激! :)
public static MatrixCursor getRespAsCursor(String query) {
String url = (String)(API_URL + "?api_key=" + API_KEY + "&" + query);
System.out.println(url);
String resp = (String)getAPIResp(url);
JSONObject reply;
MatrixCursor emptyCursor = new MatrixCursor(new String[0]);
try {
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
String statusCode = (String)reply.getString("statusCode");
if(!statusCode.equals("200")) {
return emptyCursor;
}
int count = Integer.parseInt(reply.getString("count"));
if(count < 1) {
return emptyCursor;
}
JSONArray data = reply.getJSONArray("data");
//Get keys in String[] format
Iterator<String> keys = data.optJSONObject(0).keys();
List<String> copy = new ArrayList<String>();
//Add "_id" as adapters need it for traversal
copy.add("_id");
//copy rest of the keys
while (keys.hasNext())
copy.add(keys.next());
String[] sKeys = new String[copy.size()];
copy.toArray(sKeys);
int len = data.length();
//Create Cursor with JSON keys as columns
MatrixCursor resultCursor = new MatrixCursor(sKeys, len);
//Add rows to Cursor
for(int i = 0; i < len; i++) {
JSONObject d = data.optJSONObject(i);
List<Object> values = new ArrayList<Object>();
for(String key: copy) {
if(key.equals("_id")) {
values.add(Integer.toString(i));
}
else {
values.add(d.opt(key));
}
}
resultCursor.addRow(values);
}
return resultCursor;
}
catch(JSONException e) {
return emptyCursor;
}
}
public static MatrixCursor getRespAsCursor(String query) {
String url = (String)(API_URL + "?api_key=" + API_KEY + "&" + query);
System.out.println(url);
String resp = (String)getAPIResp(url);
JSONObject reply;
MatrixCursor emptyCursor = new MatrixCursor(new String[0]);
try {
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
String statusCode = (String)reply.getString("statusCode");
if(!statusCode.equals("200")) {
return emptyCursor;
}
int count = Integer.parseInt(reply.getString("count"));
if(count < 1) {
return emptyCursor;
}
JSONArray data = reply.getJSONArray("data");
//Get keys in String[] format
Iterator<String> keys = data.optJSONObject(0).keys();
List<String> copy = new ArrayList<String>();
//Add "_id" as adapters need it for traversal
copy.add("_id");
//copy rest of the keys
while (keys.hasNext())
copy.add(keys.next());
String[] sKeys = new String[copy.size()];
copy.toArray(sKeys);
int len = data.length();
//Create Cursor with JSON keys as columns
MatrixCursor resultCursor = new MatrixCursor(sKeys, len);
//Add rows to Cursor
for(int i = 0; i < len; i++) {
JSONObject d = data.optJSONObject(i);
List<Object> values = new ArrayList<Object>();
for(String key: copy) {
if(key.equals("_id")) {
values.add(Integer.toString(i));
}
else {
values.add(d.opt(key));
}
}
resultCursor.addRow(values);
}
return resultCursor;
}
catch(JSONException e) {
return emptyCursor;
}
}
答案 0 :(得分:5)
你已经展示了演员出错的地方 - 就在这里:
reply = (JSONObject) new JSONTokener(resp).nextValue();
nextValue()
正在返回String
,您将其投放到JSONObject
。
我怀疑JSON并不像你期望的那样 - 它不是statusCode = "value"
对;这只是价值。
您应该检查您要返回的JSON,并更改为强制转换为字符串,或者如果您希望能够处理两种形式的JSON,请在转换前使用instanceof
检查结果:< / p>
Object reply = new JSONTokener(resp).nextValue();
if (reply instanceof String) {
...
} else if (reply instanceof JSONObject) {
...
}
答案 1 :(得分:2)
你可能想看看JSONTokener javadoc
文档说nextValue()
获取下一个值。值可以是布尔值,Double,Integer, JSONArray,JSONObject,Long或String,或JSONObject.NULL对象。
您可能会将ClassCastException
作为您的代码行
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
不返回JSONObject。
您可能希望在对其进行类型转换之前检查返回对象的实例类型。 例如,
Object obj = new JSONTokener(resp).nextValue();
if(obj instanceof JSONObject){
reply = (JSONObject)obj;
} else {
//Handle otherwise,
}
答案 2 :(得分:1)
reply = (JSONObject) new JSONTokener(resp).nextValue();//CRASHES HERE
如果您收到ClassCastException
,那是因为Object
返回的nextValue()
不是JSONObject(可能是String
个实例)