获取值作为JSONObject中JSONArray的集合

时间:2017-08-17 15:40:00

标签: java json

我有以下JSONObject。我有一个名为results的属性,它又是一个JSONArray,由JSONObjects组成。现在我想看看是否有任何直接的方式来获取集合形式的id,而无需在地图或列表中明确创建和stroing。预期的输出是:

输出:

["123","345","567","891"]

的JSONObject:

{
"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结果并迭代它并在MAP中保存每次迭代的值。参见下文:

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

原因:  这是在一个多线程环境中,如果我创建一个将成为共享资源的映射,我需要同步它,这将锁定另一个线程对该映射的使用,这反过来导致我的情况下出现大的性能问题。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

根据您的评论,您似乎关注的不是创建列表或散列图,而是您尝试协调跨多个不​​同线程创建生成的集合。

您可以采取许多方法,哪种方法最好取决于您的具体用例。

最简单的(代码方式)可能是使用隐式并发的集合,如ConcurrentHashMap或包含在Collections.synchronizedList()中的列表。您可能会发现这些集合的性能优于尝试管理自己的线程锁定,但很难说性能是否足以满足您的需求。

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