Java 获取值作为JSONObject中JSONArray的集合

Java 获取值作为JSONObject中JSONArray的集合,java,json,Java,Json,我有下面的JSONObject。我有一个名为results的属性,它也是一个JSONArray,由JSONObject组成。现在,我想看看是否有任何直接的方法可以以集合的形式获取id,而无需在地图或列表中显式创建和排序。预期产出为: 输出: ["123","345","567","891"] { "status": { "status": "OK", "message": "" }, "offset": 1, "limit": "200", "results": [ {

我有下面的JSONObject。我有一个名为results的属性,它也是一个JSONArray,由JSONObject组成。现在,我想看看是否有任何直接的方法可以以集合的形式获取id,而无需在地图或列表中显式创建和排序。预期产出为:

输出:

["123","345","567","891"]
{
"status": {
    "status": "OK",
    "message": ""
},
"offset": 1,
"limit": "200",
"results": [
    {
      "id": “123”,
      "title": “title1”
    },
    {
       "id": “345”,
      "title": “title2”
    },
    {
       "id": “567”,
      "title": “title3”
    }, 

    {
      "id": “891”,
      "title": “title4”
    }
 ]
}
JSONObject:

["123","345","567","891"]
{
"status": {
    "status": "OK",
    "message": ""
},
"offset": 1,
"limit": "200",
"results": [
    {
      "id": “123”,
      "title": “title1”
    },
    {
       "id": “345”,
      "title": “title2”
    },
    {
       "id": “567”,
      "title": “title3”
    }, 

    {
      "id": “891”,
      "title": “title4”
    }
 ]
}
现在,我正在获取JSONArray结果并对其进行迭代,并将每次迭代的值保存在一个映射中。请参见以下内容:

for (int k = 0; k <= resultsArray.length()-1 ; k++) {
    JSONObject j = resultsArray.getJSONObject(k);                                               
    id = j.getLong("id");
    map.put(title,
    "\"" + Long.toString(id) + "\"");
}

for(int k=0;k根据您的评论,您关心的似乎不是创建列表或hashmap,而是尝试跨多个不同线程协调结果集合的创建

您可以采取很多方法,哪种方法最好取决于您的特定用例

最简单的(代码方面的)可能是使用隐式并发的集合,如或封装在中的列表。您可能会发现这些集合的性能比尝试管理自己的线程锁定要好,但很难说性能是否足以满足您的情况


另一种可能是让每个线程独立地解析json并生成一个单独的集合,这样大部分工作都是以线程安全的方式完成的,然后在最后将结果合并到一个线程安全/同步的操作中。只有当ID列表是循环的所需输出时,这才起作用,而您确实这样做了在所有线程完成处理之前,不需要提供中间结果。但如果这对您有效,那么您可能会获得比10个线程在整个过程中争夺单个资源更好的性能。

您的意思是“一次获取所有id,而不必迭代JSONArray”?@magicleon是的。那么,我可以使用任何预定义的方法以集合的形式获取它们吗?出于特定的原因,我不想在这里使用映射来保存它们(原因:这是在一个多线程环境中,如果我创建一个映射,它将是一个共享资源,并且我需要同步它,这将锁定另一个线程对该映射的使用,这反过来会导致我的情况下出现一个大的性能问题。)。嗯,我不知道有任何这样的方法。你可以制作一个
ArrayList
并附加所有id,而无需使用映射(如果你想要输出,你实际上不需要映射键).A
synchronized
方法在任何一种情况下都是必要的,因为我相信,即使存在您想要的方法,也会涉及更多操作,从而使您回到共享资源问题。是的,即使使用列表,也会出现相同的问题:(这对性能有很大影响。)(当您说这是一个“共享资源”时,不确定是否存在@magicleon解决方案:您是基于此JSON对象创建一次映射,然后从一组不同的线程读取它,还是基于多个线程的输入主动更新映射?