4

我有一个来自网络服务的响应,数据是JSON形式的。

JSONObject event:-

{
  "15:00":{"type":1,"status":null,"appointment_id":null}, 
  "16:00":{"type":1,"status":null,"appointment_id":null},
  "17:00":{"type":1,"status":null,"appointment_id":null},
  "18:00":{"type":1,"status":"1","appointment_id":5}
}

我不知道关键值,它们是随机的。keys因此,当我通过获取和使用迭代器迭代数据时hasNext()。它返回数据,但会更改传入数据的顺序。

Iterator AppoinmentIter = event.keys();
while(AppoinmentIter.hasNext()){   
        String appointmentTime = (String)AppoinmentIter.next();   
        JSONObject appointmentDetails = event.getJSONObject(appointmentTime);
 }

我想要数据的准确顺序。我检查了这个链接,它建议使用LinkedHashMap。但在这里他们通过键插入值。而且我不知道我的数据中的密钥。那么我怎样才能以正确的顺序迭代数据。请帮忙..

4

3 回答 3

2

这不是 JSON 的工作方式。它假设顺序无关紧要,除非你有一个数组。如果你想要顺序,你使用了错误的格式——你需要使用一个时间数组->值,而不仅仅是时间->值。

对于您的特定应用程序,您可以获得一组键,然后使用自定义比较器对它们进行排序,该比较器使用解析的值作为时间来对它们进行排序。但是内置库不会为您做这件事,因为您没有按照设计使用 JSON。

于 2013-07-08T05:44:24.197 回答
1

Vikas,据我了解您的问题,我设法以预期格式检索 json 对象,希望这会对您有所帮助。享受!!

   String s = "{ \"15:00\":{\"type\":1,\"status\":null,\"appointment_id\":null},\"16:00\":{\"type\":1,\"status\":null,\"appointment_id\":null},\"17:00\":{\"type\":1,\"status\":null,\"appointment_id\":null},\"18:00\":{\"type\":1,\"status\":\"1\",\"appointment_id\":5}}";
    try {
        JSONObject jobj = new JSONObject(s);
        Iterator iter = jobj.keys();
        while(iter.hasNext()){   
            String appointmentTime = String.valueOf(iter.next());
            aRRaY.add(appointmentTime);

     }
      Collections.sort(aRRaY); 
      for(String key : aRRaY){
          JSONObject appointmentDetails = jobj.getJSONObject(key);
          System.out.println(key +" ----- "+appointmentDetails);
      }

    }
    catch (JSONException e) {
        e.printStackTrace();
    }
于 2013-07-08T08:18:37.767 回答
0

我不知道您所做的实施,以及您参与的 3pp。但无论如何,试试下面的代码,你会得到你想要的。

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map.Entry;

import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;

public class Test {

    private static final ObjectMapper mapper = new ObjectMapper();

    public static void main(String[] args) {
        String json = "{"
                + "\"15:00\":{\"type\":1,\"status\":null,\"appointment_id\":null}, "
                + "\"16:00\":{\"type\":1,\"status\":null,\"appointment_id\":null},"
                + "\"17:00\":{\"type\":1,\"status\":null,\"appointment_id\":null},"
                + "\"18:00\":{\"type\":1,\"status\":\"1\",\"appointment_id\":5}"
            + "}";
        LinkedHashMap<String, LinkedHashMap<String, Integer>> fromJSON = fromJSON(
            json, LinkedHashMap.class);
        for (Entry<String, LinkedHashMap<String, Integer>> entry : fromJSON
            .entrySet()) {
            System.out.print(entry.getKey());
            System.out
                .println(" || status = " + entry.getValue().get("status"));
        }
    }

    public static <T> T fromJSON(String input, Class<T> clazz) {
        try {
            return mapper.readValue(input != null ? input : "null", clazz);
        } catch (JsonParseException e) {
            throw new RuntimeException(e);
        } catch (JsonMappingException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
于 2013-07-08T06:03:48.333 回答