Android应用程序从网站解析JSON

时间:2012-09-10 15:26:20

标签: java android json

好的,所以第一道障碍在几分钟后就被清除了,让我们看看这个障碍是怎么做的。

正如我在日志中看到的那样,代码正在从网站中提取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

2 个答案:

答案 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。键/值对中具有引号的任何第二个值可能是一个字符串,而没有引号的值则被检索为数字。