【问题标题】:Android app to parse JSON from website用于从网站解析 JSON 的 Android 应用
【发布时间】:2012-09-12 21:22:28
【问题描述】:

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

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

【问题讨论】:

  • 好吧,因为数据不是json数组。它是一个带有键“stoker”等的 JSON 对象......
  • 你能把整个堆栈跟踪吗?这将帮助您了解是哪一行引发了异常。

标签: java android json


【解决方案1】:

您不能在不指定 Object 或 Array 的情况下仅使用 Java API 解析 JSON — JSON 文档都可以。由于您在日志中的数据显示了一个对象,因此您需要在第二行请求一个 JSONObject。

【讨论】:

    【解决方案2】:

    只要你的 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。键/值对中带有引号的任何第二个值都可能是字符串,而没有引号的值则作为数字检索。

    【讨论】:

    • 非常感谢您对对象与数组的彻底解释。我认为这是问题所在,但您的解释以及代码更改有助于我理解差异。我收到一个 JSONException 错误,没有找到传感器的数据,但这将是另一个问题。
    • 您应该确保您的 JSON 字符串有效。 jsonformatter.curiousconcept.com 是一款出色的 JSON 格式化程序和验证工具,可确保您的数据正确构建。它也完全基于浏览器,无需下载。此外,由于您的整个输出都是一个对象,您可能需要先获取“stoker 对象”并从中获取“sensors”数组。
    • 我通过格式化程序网站运行了 JSON 数据,它是有效的。我不断收到传感器不存在数据的错误。我认为您首先需要获取 stoker 对象和传感器阵列是正确的,但我无法弄清楚如何使其工作。我非常感谢您能提供的任何帮助,但请了解此时此问题是否已解决。我仍在努力,并会问一个新问题是必要的。再次感谢。
    • @MCeley- 非常感谢您更新代码。效果很好,你帮助我理解了比昨天更多的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多