我正在开发一个应用程序,我有一个JSON
响应,如下所示:
{
"notifications":{
"0":{
"text":"First One",
"state":"new"
},
"1":{
"text":"Second One",
"state":"new"
},
"2":{
"text":"Third One",
"state":"new"
},
"3":{
"text":"Fourth One",
"state":"old"
},
"4":{
"text":"Fifith One",
"state":"old"
}
}
}
我正在使用Iterator
类来解析此响应。我正在做这样的事情:
notifyList = new ArrayList<HashMap<String, String>>();
try {
JSONObject rootObj = new JSONObject(result);
JSONObject jSearchData = rootObj.getJSONObject("notifications");
Iterator<String> keys = jSearchData.keys();
while (keys.hasNext()) {
String key = keys.next();
JSONObject jNotification0 = jSearchData.optJSONObject(key);
if (jNotification0 != null) {
String text = jNotification0.getString("text");
String state = jNotification0.getString("state");
HashMap<String, String> map = new HashMap<String, String>();
map.put("text", text);
map.put("state", state);
System.out.println("Text: " + text);
System.out.println("State: " + state);
notifyList.add(map);
}
else {
}
但是这给了我混乱格式的数据,它不像JSON
响应那样明智。
这是打印的log
,这些都是混乱的:
Text: Fourth One
State: old
Text: Third One
State: new
Text: Second One
State: new
Text: First One
State: new
Text: Fifth One
State: old
我只是使用“状态”变量并相应地对其进行排序,以便我的“新”状态在“旧状态”之前出现。但如果我在回复中有2-3个新状态,这对我没有帮助。
我尝试过这样的集合代码:
Collections.sort(notifyList,
new Comparator<Map<String, String>>() {
@Override
public int compare(final Map<String, String> map1,
final Map<String, String> map2) {
int comparison = map1.get("state")
.compareToIgnoreCase(map2.get("state"));
if (comparison == 0)
return 0;
else if (comparison > 0)
return 1;
else
return -1;
}
}
);
任何想法如何解决这个问题我想明智地显示响应顺序?
任何形式的帮助都将受到赞赏。
答案 0 :(得分:1)
我建议将“1”,“2”,...值替换为Json数组,以便它看起来像:
{
"notifications":[
{
"text":"First One",
"state":"new"
},
{
"text":"Second One",
"state":"new"
},
{
"text":"Third One",
"state":"new"
},
{
"text":"Fourth One",
"state":"old"
},
{
"text":"Fifith One",
"state":"old"
}
]
}
这样你可以迭代数组而不用担心元素顺序
答案 1 :(得分:0)
首先:你的地图是错的。你以这种方式放置键/值:
key | value
---------------------------
text | First One
state | new
text | second one
state | new
text | Third one
state | new
text | Fourth one
state | old
因此所有值都将被覆盖(您使用相同的键放置它们)。
第二:您需要String
的比较器,而不是Map<String, String>
。
List<String> sortedKeys = new ArrayList<>();
sortedKeys.addAll(map.keySet()); //sorted keys will hold all keys for the map
Collection.sort(
sortedKeys,
new Comparator<String>(){
int compare(String s1, String s2) {
return comparison = map.get(s1)
.compareToIgnoreCase(map.get(s2));
}
});
//here you'll have sortedKeys - with keys sorted by the state.
// just get the values from the map iterating it the sortedKeys.
答案 2 :(得分:0)
您的数据似乎应该采用数组格式。但是,作为一种解决方法,如果您总是将数字作为键,那么您可以创建一个帮助类Notification
。这将包含3个字段:key
,text
,state
。
您不会返回List
Map
,而是返回List<Notification>
notifyList = new ArrayList<Notification>();
while (...) {
...
String text = jNotification0.getString("text");
String state = jNotification0.getString("state");
Notification notification = new Notification(key, text, state);
notifyList.add(notification);
}
然后,您可以使用Comparator
按key
字段排序,以获得与文本中相同的顺序或您喜欢的州和密钥之间的任意组合(例如,通过保持同一州内物品的订单相同)