2012-06-20 8 views
0

Как я могу сортировать вложенный массив JSON? Как для JSON ниже ...Как я могу сортировать вложенный массив JSON?

{ 
    "id":"rtmc05.lax.someabc.net", 
    "name":"rtmc05.lax.someabc.net", 

    "tenants":[{ 
     "id":"rtmc", 
     "name":"rtmc" 
    },{ 
     "id":"hrs", 
     "name":"hrs" 
    },{ 
     "id":"amotelbe1", 
     "name":"amotelbe" 
    },{ 
     "id":"cds", 
     "name":"cds" 
    },{ 
     "id":"idx-server", 
     "name":"idx-server", 

     "tenants":[{ 
      "id":"amotelbe", 
      "name":"amotelbe", 

      "tenants":[{ 
       "id":"amotelui", 
       "name":"amotelui" 
      }] 
     }] 
    }] 
} 

ответ

0

Разобрать его в (JavaScript) объекты, то написать функцию сортировки, которая сортирует массив таких объектов яваскрипта.

0

Там в несколько частей неявных на ваш вопрос, и это не ясно, где у вас возникли проблемы:

  1. Как взять строку JSON и сделать использовать Java объекты из него. (Я предполагаю Java, а не JavaScript, так как вы отметили свой вопрос с помощью «java».)
  2. Как вы сортируете эти объекты после их создания?
  3. Как вы обрабатываете сортировку вложенных частей? (В вашем примере у «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); 
      } 
     } 
    } 
} 

Надеюсь, это поможет!

Смежные вопросы