1

我正在开发一个应用程序,我有一个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;
                        }
                    }

            );

知道如何解决这个问题我想明智地显示响应顺序吗?

任何形式的帮助将不胜感激。

4

3 回答 3

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"
  }
 ]
}

这样您就可以遍历数组而不用担心元素顺序

于 2013-07-30T13:47:18.783 回答
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.
于 2013-07-30T14:03:26.047 回答
0

您的数据似乎应该是数组格式。但是,作为一种解决方法,如果您总是将数字作为键,那么您可以创建一个 helper 类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);
}

然后,您可以使用 aComparatorkey字段排序以获得与文本中相同的顺序或您喜欢的状态和键之间的任何组合(例如,通过保持相同状态中的项目的相同顺序来按状态排序)

于 2013-07-30T15:24:24.463 回答