2012-06-20 3 views
0

어떻게 중첩 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

... 아래 JSON 대해 원하는 그러한 스크립트 오브젝트의 배열을 정렬하는 정렬 기능을 작성 개체 (자바 스크립트)로 파싱.

0

POJO (Gson 또는 Jackson)에 대해 비 직렬화하고 해당 POJO에 대해 Comparator을 작성하십시오.

0

이 질문에 대한 암시 몇 가지 부분, 그리고 그것은 당신이하는 데 문제가있는 경우 분명하지 않다 : 당신이 JSON 문자열을 가지고 사용할 수있는 자바 그것의 개체를 어떻게해야합니까

  1. . (당신이 "java"로 질문을 태그했기 때문에 자바 스크립트가 아닌 자바라고 가정합니다.)
  2. 이 오브젝트들은 어떻게 만들어 졌습니까?
  3. 중첩 된 부분 정렬은 어떻게 처리합니까? (귀하의 예에서 "idx-server"에는 하위 테넌트가 있습니다.)

이 부분에서 문제가있는 부분을 정확하게 알지 못하므로 여기에 3 가지 노트가 있습니다.

1 부 : 자바를 얻기는

내가 Jackson을 사용하는 것이 JSON 파서는 것을 다른 사람에 동의

객체. 다음은 몇 가지 JSON을 구문 분석하는 데 사용할 수있는 코드 몇 줄의 :

당신의 JSON 문자열이 정말 큰 경우, 당신은 메모리에 전체 문자열을 읽는 방지하기 위해 사용할 수있는 다른 readValue 과부하가
String jsonString = "..."; // Load this in whatever way makes sense for you 
ObjectMapper mapper = new ObjectMapper(); 
Map<String,Object> parsedJson = mapper.readValue(jsonString, Map.class); 

.

제 2 부 : 당신은 구문 분석 JSON을했으면 정렬 자바

객체, 정렬은 tenants 배열을 전달, Collections.sort(...)를 호출의 문제이다. 또한 원하는 순서를 정의하는 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); 
      } 
     } 
    } 
} 

희망이 있습니다.

관련 문제