好的,所以第一道障碍在几分钟后就被清除了,让我们看看这个障碍是怎么做的。
正如我在日志中看到的那样,代码正在从网站中提取JSON数据,但现在JSONParser失败了。我认为问题是JSONObject与JSONArray,但我无法弄明白。
以下是从日志中看到的从JSON站点提取的数据:
09-10 09:45:00.175: I/log_tag(785): {"stoker":{"sensors":[{"id":"620000116F01CA30","name":"SS2","al":0,"ta":66,"th":75,"tl":65,"tc":66.3,"blower":null},09-10 09:45:00.175: I/log_tag(785): {"id":"E20000116F0CDB30","name":"brskt2","al":0,"ta":203,"th":32,"tl":32,"tc":70.6,"blower":null}],09-10 09:45:00.175: I/log_tag(785): "blowers":[{"id":"37000000119D8B05","name":"party","on":0}]}}
以下是试图解析数据的代码:
try{
JSONArray jArray = new JSONArray(result);
for(int i=0;i<jArray.length();i++){
JSONObject json_data = jArray.getJSONObject(i);
Sensor resultRow = new Sensor();
resultRow.id = json_data.getString("id");
resultRow.name = json_data.getString("name");
resultRow.current = json_data.getString("tc");
resultRow.target = json_data.getString("ta");
arrayOfWebData.add(resultRow);
}
}
catch(JSONException e){
Log.e("log_tag", "Error parsing data "+e.toString());
}
以下是日志文件失败时的条目:
09-10 09:45:00.314: E/log_tag(785): Error parsing data org.json.JSONException: Value {"stoker":{"sensors":[{"id":"620000116F01CA30","al":0,"tl":65,"tc":66.3,"ta":66,"name":"SS2","blower":null,"th":75},{"id":"E20000116F0CDB30","al":0,"tl":32,"tc":70.6,"ta":203,"name":"brskt2","blower":null,"th":32}],"blowers":[{"id":"37000000119D8B05","on":0,"name":"party"}]}} of type org.json.JSONObject cannot be converted to JSONArray
答案 0 :(得分:3)
您不能仅使用Java API解析JSON而不指定Object或Array - JSON文档也可以。由于日志中的数据显示了一个Object,因此您需要在第二行请求JSONObject。
答案 1 :(得分:1)
只要logcat中的JSON字符串准确无误,就有两件事需要改变。首先,您的结果是包含JSONArray的JSONObject。您必须先创建一个对象,然后从该对象中提取该数组。其次,tc和ta分别在输出中显示为双精度和整数,并且需要如此检索。它看起来都像这样:
try {
JSONObject obj = new JSONObject(result);
JSONObject stoker = obj.getJSONObject("stoker");
JSONArray jArray = stoker.getJSONArray("sensors");
for(int i = 0; i < jArray.length(); i++) {
JSONObject json_data = jArray.getJSONObject(i);
Sensor resultRow = new Sensor();
resultRow.id = json_data.getString("id");
resultRow.name = json_data.getString("name");
resultRow.current = json_data.getDouble("tc");
resultRow.target = json_data.getInt("ta");
arrayOfWebData.add(resultRow);
}
}
catch(JSONException e){
Log.e("log_tag", "Error parsing data "+e.toString());
}
根据提供的JSON字符串,这应该有效。为了将来参考,{}中包含的任何内容都是JSONObject,而[]中的任何内容都是JSONArray。键/值对中具有引号的任何第二个值可能是一个字符串,而没有引号的值则被检索为数字。