将HashMap转换为JSONArray,值无法正确显示

时间:2018-07-03 09:08:35

标签: java json elasticsearch collections

正在从Elasticsearch中获取重复的响应,以避免我使用Hashmap实现并将所有值put放入HashMap对象中。

之后,遍历HashMap对象以转换为JSONArray。

我从distinctObjects(HashMap对象)中获得了一条唯一记录。但是如果转换为JSONArray。,则JSONArray的长度显示为2,应该是1,并且正在打印JSONArray,如下所示。

JSONArray --->[{"code":"VA1125-GGA-1","id":"code"},{"code":"12816","id":"id"}]

预期结果应为:

JSONArray --->[{"code":"VA1125-GGA-1","id":"12816"}]

请在下面找到我的代码。

JSONObject responseObj;
JSONArray responseArray = new JSONArray();
Map<String, Object> distinctObjects = null;
SearchHit[] searchHits2 = searchResponse2.getHits().getHits();
for (SearchHit hit2 : searchHits2) {
    Map<String, Object> sourceAsMap2 = hit2.getSourceAsMap();
    distinctObjects = new HashMap<String, Object>();
    distinctObjects.put("id", sourceAsMap2.get("id").toString());
    distinctObjects.put("code", sourceAsMap2.get("code").toString());
}               

Iterator it = distinctObjects.entrySet().iterator();
while (it.hasNext()) {
    Map.Entry pair = (Map.Entry)it.next();
    System.out.println(pair.getKey() + " = " + pair.getValue());
    responseObj = new JSONObject();
    responseObj.put("id", pair.getKey());
    responseObj.put("code", pair.getValue());
    responseArray.put(responseObj);
    it.remove(); // avoids a ConcurrentModificationException
}

System.out.println("Link ID List Size --->"+responseArray.length());
System.out.println("JSONArray --->"+responseArray.toString());

1 个答案:

答案 0 :(得分:1)

似乎您要将codeid都作为顶级条目添加到distinctObjects映射中,这就是为什么要取回两个对象的原因。假设您要根据ID进行重复数据删除,则第一个循环应类似于:

for (SearchHit hit2 : searchHits2) {
    Map<String, Object> sourceAsMap2 = hit2.getSourceAsMap();
    distinctObjects = new HashMap<String, Object>();
    distinctObjects.put(sourceAsMap2.get("id"), sourceAsMap2.get("code").toString());
}    

这将为您提供distinctObjects中每个值为code的唯一ID的条目。

如果您希望在下游处理中不仅仅需要sourceAsMap2,还可以在distinctObjects中将code添加为值,以维持完整的响应。