【问题标题】:cannot cast JSONObject to JSONArray无法将 JSONObject 转换为 JSONArray
【发布时间】:2015-02-25 13:54:29
【问题描述】:

我正在尝试将返回的 JSON 数据转换为数组,以便可以在 listView 中使用数据。

我得到以下代码:

JSONObject jsonobject;
jsonobject = JSONFunctions.getJSONfromURL("example/url");

ArrayList<String> list = new ArrayList<String>();
JSONArray jsonArray = (JSONArray)jsonobject;
if (jsonArray != null) {
   //do something with it
}

注意:我对 Java 没有任何经验。
getJSONfromURL 方法返回给定 URL 的 JSON,可以正常工作,但错误在 JSONArray jsonArray = (JSONArray)jsonobject;

它给出了以下错误:无法将 JSONObject 转换为 JSONArray 我也试过这个:JSONArray jsonArray = (JSONObject)(JSONArray)jsonobject;

我不知道我做错了什么。

那么如何将我的 jsonobject 转换为可以用作 listView 数据的普通数组?

【问题讨论】:

  • 你使用的是哪个库?
  • 我会看一下您从 URL 中返回的 JSON(如果可以,请在此处发布)。你确定它是一个数组?一般来说,返回顶级数组被认为是一个安全漏洞。
  • 这个? json.org/javadoc/index.html 没有名为JSONFunctions 的类。
  • 是的,这就是我正在使用的。误会JSONFunctions是我自己写的一个类。
  • 如果你需要一个数组,你可以使用new JSONArray(String)

标签: java json


【解决方案1】:

JSONObjectJSONArray 不同。如果你尝试new JSONObject("['test', 'array']"),你会得到一个JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]

试试这是否适合你:

static JSONArray fromUrl(URL url) throws IOException {
    try (
        InputStream openStream = url.openStream();
        BufferedInputStream bis = new BufferedInputStream(openStream);
        Scanner scanner = new Scanner(bis, StandardCharsets.UTF_8.name());
    ) {
        if (!scanner.useDelimiter("\\A").hasNext()) {
            throw new EOFException("empty response");
        }
        return new JSONArray(scanner.next());
    }
}

【讨论】:

  • 感谢您的回答,但您的代码在最后一行返回新 JSONArray 时抛出错误。错误:未处理的异常:JSONException
  • @Bas 在我下载的源代码 (github.com/douglascrockford/JSON-java/blob/master/…) 中不需要处理,因为它是 extends RuntimeException。然后你必须通过添加catch-clause 来处理异常,或者通过将其放入throws-clause (throws IOException, JSONException) 来声明它被抛出。但这是您绝对应该掌握的基本 Java 知识。
【解决方案2】:

JSONObject 就像 java 中的 Map。键值对。 因此,您应该像迭代 Map 一样进行迭代:

Iterator iterator = jsonobject.keys();
JSONArray jsonArray = new JSONArray();

while (iterator.hasNext()){
    String key = (String) iterator.next(); // assuming the key to be a String
    // You can put the key also if you want. But, It does not make any sense to do so.
    jsonArray.put(jsonobject.get(key)); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多