Там в несколько частей неявных на ваш вопрос, и это не ясно, где у вас возникли проблемы:
- Как взять строку JSON и сделать использовать Java объекты из него. (Я предполагаю Java, а не JavaScript, так как вы отметили свой вопрос с помощью «java».)
- Как вы сортируете эти объекты после их создания?
- Как вы обрабатываете сортировку вложенных частей? (В вашем примере у «idx-server» есть суб-арендаторы.)
Не знаете, с какими частями этого вы столкнулись, так что вот некоторые примечания для всех трех.
Часть 1: Получение Java объектов
Я согласен с другим парнем, что Jackson является хорошим JSON парсер использовать. Вот несколько строк коды, вы могли бы использовать, чтобы разобрать некоторые JSON:
String jsonString = "..."; // Load this in whatever way makes sense for you
ObjectMapper mapper = new ObjectMapper();
Map<String,Object> parsedJson = mapper.readValue(jsonString, Map.class);
Если строка JSON действительно огромна, то есть и другие readValue
перегрузок, которые вы можете использовать, чтобы не читать всю строку в память.
Часть 2: Сортировка Java объекты
После того, как вы получили разобранный JSON, сортировка это просто вопрос вызова Collections.sort(...)
, проходя в tenants
массиве. Кроме того, вам нужно написать Comparator, который определяет требуемый заказ. Например, вот компаратор, который сортирует по имени:
public class NameComparator implements Comparator<Map<String,Object>> {
public int compare(Map<String,Object> o1, Map<String,Object> o2) {
String name1 = (String) o1.get("name");
String name2 = (String) o2.get("name");
return name1.compareTo(name2);
}
}
Тогда вы получите массив жильцов (Джексон делает их в ArrayList
объекты) и вызвать Collections.sort(...)
. Например,
List<Map<String,Object>> tenants =
(List<Map<String,Object>>) parsedJson.get("tenants");
Collections.sort(tenants, new NameComparator());
Часть 3: Обработка вложенности
Самый ясный способ сделать это, чтобы добавить дополнительный код, чтобы идти через JSON в поисках какого-либо объекта с массивом жильцов, и сортировать его. Например, вот рекурсивная функция, которая должна это сделать:
public static void recursiveSortTenants(Map<String,Object> jsonObject) {
List<Map<String,Object>> tenants =
(List<Map<String,Object>>) jsonObject.get("tenants");
if (tenants != null) {
Collections.sort(tenants, new NameComparator());
// For each tenant, see if it has sub-tenants. If so,
// call this function again to sort them.
for (Map<String,Object> tenant : tenants) {
if (tenants.containsKey("tenants")) {
recursiveSortTenants(tenant);
}
}
}
}
Надеюсь, это поможет!