我有一个JSON响应,看起来像这样(它与用户不同)
{
"success": true, "data":
[
{
"mandatory_tag": "My Company",
"id": "topic_1408946825893148"
},
{
"mandatory_tag": "Partners",
"id": "topic_1408946942491149",
},
{
"mandatory_tag": "Industry",
"id": "topic_1408946996510150",
},
{
"mandatory_tag": "Competitors",
"id": "topic_1409210454810358",
},
{
"mandatory_tag": "Competitors",
"id": "topic_1408947133657152"
},
{
"mandatory_tag": "Competitors",
"id": "topic_1408947071457151",
},
{
"mandatory_tag": "Competitors",
"id": "topic_1409210621754362",
},
{
"mandatory_tag": "Competitors",
"id": "topic_1409210704390363",
},
{
"mandatory_tag": "Competitors",
"id": "topic_1409210794791364"
}
]
}
我正在解析它并尝试存储在HashMap中,但键值是重复的。任何人都可以建议我如何将所有具有相同mandatory_tag的id存储在一个数组中?
我是新手,所以请考虑......谢谢
try { JSONObject jsonMain = new JSONObject(jsonString); JSONArray dataArray = jsonMain.getJSONArray("data"); for(int i = 0; i < dataArray.length(); i++) { JSONObject tagObject = dataArray.getJSONObject(i); String mandatory_tag = tagObject.getString("mandatory_tag"); String id = tagObject.getString("id"); List<String> arrayID = new ArrayList<String>(); if(myMap.containsKey(mandatory_tag)) { arrayID.add(id); myMap.put(mandatory_tag, arrayID); } else { List<String> newArrayID = new ArrayList<String>(); newArrayID.add(id); myMap.put(mandatory_tag, newArrayID); } }
好吧,我现在卡住了这个......好的逻辑就好了..
答案 0 :(得分:1)
hashmap允许您存储键值项。我建议HashMap的类型为<String,List<String>>
,这样您就可以在1键下的同一列表中存储具有相同mandatory_tag
的项目。
例如
HashMap<String,List<String>> myMap = new HashMap<String,List<String>>();
if (myMap.containsKey(mandatory_tag)) {
List<String> values = myMap.get(mandatory_tag);
if (values!=null) {
values.add(id)
} else {
values = new List<String>();
values.add(id);
}
}
<强>更新强>
正如我在下面的评论中所写,除了你添加的内容有错误
List<String> arrayID = new ArrayList<String>();
if(myMap.containsKey(mandatory_tag))
{
arrayID.add(id);
myMap.put(mandatory_tag, arrayID);
}
你在这里做的是,如果地图已经包含你要用一个只包含1个值的新列表替换与该键相关联的值的键。您需要做的是更新已存在的值列表。检查下面的代码,确保您了解问题。这些是编程的基础,你需要了解你正在做的事情的逻辑。
//Somewhere you have declared your HashMap
HashMap<String,List<String>> myMap = new HashMap<String,List<String>>();
//then we continue with your excerpt
try {
JSONObject jsonMain = new JSONObject(jsonString);
JSONArray dataArray = jsonMain.getJSONArray("data");
for(int i = 0; i < dataArray.length(); i++) {
JSONObject tagObject = dataArray.getJSONObject(i);
String mandatory_tag = tagObject.getString("mandatory_tag");
String id = tagObject.getString("id");
if(myMap.containsKey(mandatory_tag)) {
List<String> arrayID = myMap.get(mandatory_tag);
arrayID.add(id);
} else {
List<String> newArrayID = new ArrayList<String>();
newArrayID.add(id);
myMap.put(mandatory_tag, newArrayID);
}
}
答案 1 :(得分:0)
使用变量TagValues
,mandatory_tag
创建一个名为id
(或您想要的任何名称)的POJO,然后创建一个ArrayList<TagValues>
,您可以在其中存储所有对象。
答案 2 :(得分:0)
感谢您的回复,但在您的帮助下,我得到了解决方案
`HashMap<String,List<String>> myMap = new HashMap<String,List<String>>();
for(int i = 0; i < dataArray.length(); i++)
{
JSONObject tagObject = dataArray.getJSONObject(i);
String mandatory_tag = tagObject.getString("mandatory_tag");
String id = tagObject.getString("id");
if(myMap.isEmpty())
{
arrayID = new ArrayList<String>();
arrayID.add(id);
myMap.put(mandatory_tag, arrayID);
}
else if(myMap.containsKey(mandatory_tag))
{
arrayID.add(id);
myMap.put(mandatory_tag, arrayID);
}
else
{
arrayID = new ArrayList<String>();
arrayID.add(id);
myMap.put(mandatory_tag, arrayID);
}
}`
答案 3 :(得分:0)
在这些情况下,我想使用自定义HashMap
:
public MMap getData() {
MMap result = new MMap();
JSONArray array = getJSONArrayFromTotalJSON();
for (int i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
String mtag = obj.getString(MANDATORY_TAG);
String id = obj.getString(ID);
result.put(mtag, id);
}
return result;
}
public class MMap extends HashMap<String, List<String>> {
public void put(String key, String value) {
if (!this.containsKey(key))
this.put(key, new ArrayList<String>());
this.get(key).add(value);
}
}