Итерация данных Json из веб-сервиса в правильном порядке
У меня есть ответ от веб-службы, данные в 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
, Но здесь они вставляют значение ключами. И я не знаю ключей в моих данных. Так, как я могу перебрать данные в правильном порядке. Пожалуйста помоги..
3 ответа
Викас, насколько я понял твою проблему, мне удалось получить объект 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();
}
Это не так, как работает JSON. Предполагается, что порядок не имеет значения, если у вас нет массива. Если вы хотите, чтобы порядок имел значение, вы используете неправильный формат - вам нужно использовать массив раз-> значений, а не просто раз-> значение.
Для вашего конкретного приложения вы можете получить набор ключей, а затем отсортировать их с помощью специального компаратора, который использует значение, проанализированное как время, чтобы упорядочить их. Но встроенные библиотеки не сделают этого за вас, потому что вы не используете JSON, как это было задумано.
Я не знаю, какую реализацию вы сделали, и какие 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);
}
}
}