Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 JSONArray를 정렬하는 방법

JSON(JavaScript Object Notation)은 가장 널리 사용되는 데이터 교환 형식 중 하나로, 경량(lightweight)이며 특정 프로그래밍 언어에 종속되지 않는 언어 독립적인 특징을 가지고 있습니다.

Java에서 JSONArray는 문자열(String)로부터 텍스트를 파싱하여 벡터(vector)와 유사한 객체를 생성하며, 내부적으로 java.util.List 인터페이스를 지원합니다. 이러한 특성 덕분에 JSONArray의 요소들을 Java 컬렉션 프레임워크의 기능을 활용해 손쉽게 정렬할 수 있습니다.

아래 예제에서는 JSONArray에 담긴 객체들을 특정 키(Name)를 기준으로 사전순으로 정렬하는 방법을 살펴보겠습니다. 핵심 아이디어는 다음과 같습니다.

  • JSONArray의 각 요소(JSONObject)를 List에 담습니다.
  • Collections.sort() 메서드와 Comparator를 사용하여 원하는 키 기준으로 정렬합니다.
  • 정렬된 결과를 새로운 JSONArray에 다시 담아 반환합니다.

예제 코드

import java.util.*;
import org.json.*;

public class SortJSONArrayTest {
    public static void main(String[] args) {
        String jsonStr = "[ { \"ID\": \"115\", \"Name\": \"Raja\" },"
                       + "{ \"ID\": \"120\", \"Name\": \"Jai\" },"
                       + "{ \"ID\": \"125\", \"Name\": \"Adithya\" }]";
        JSONArray jsonArray = new JSONArray(jsonStr);
        JSONArray sortedJsonArray = new JSONArray();
        List list = new ArrayList();

        // JSONArray의 각 JSONObject를 List에 추가
        for(int i = 0; i < jsonArray.length(); i++) {
            list.add(jsonArray.getJSONObject(i));
        }
        System.out.println("Before Sorted JSONArray: " + jsonArray);

        // 'Name' 키를 기준으로 오름차순 정렬
        Collections.sort(list, new Comparator() {
            private static final String KEY_NAME = "Name";
            @Override
            public int compare(JSONObject a, JSONObject b) {
                String str1 = new String();
                String str2 = new String();
                try {
                    str1 = (String)a.get(KEY_NAME);
                    str2 = (String)b.get(KEY_NAME);
                } catch(JSONException e) {
                    e.printStackTrace();
                }
                return str1.compareTo(str2);
            }
        });

        // 정렬된 List의 요소를 새로운 JSONArray에 추가
        for(int i = 0; i < jsonArray.length(); i++) {
            sortedJsonArray.put(list.get(i));
        }
        System.out.println("Sorted JSON Array with Name: " + sortedJsonArray);
    }
}

실행 결과

Before Sorted JSONArray:
[{"ID":"115","Name":"Raja"},
    {"ID":"120","Name":"Jai"},
    {"ID":"125","Name":"Adithya"}]
Sorted JSON Array with Name:
[{"ID":"125","Name":"Adithya"},
    {"ID":"120","Name":"Jai"},
    {"ID":"115","Name":"Raja"}]

코드 설명

위 코드의 동작 방식을 단계별로 살펴보면 다음과 같습니다.

  1. JSON 문자열 파싱: JSON 형식의 문자열을 JSONArray 객체로 변환합니다.
  2. List 변환: JSONArray는 직접 정렬할 수 없으므로, 각 요소를 ArrayList로 옮깁니다.
  3. Comparator 구현: compare() 메서드에서 각 JSONObject에서 Name 값을 추출한 뒤, compareTo()를 통해 두 문자열을 비교합니다. 이 비교 결과에 따라 요소들이 이름의 알파벳 순서(오름차순)로 정렬됩니다.
  4. 결과 재구성: 정렬된 List의 요소들을 순서대로 새로운 JSONArray에 넣어 최종 결과를 만듭니다.

실행 결과를 보면 정렬 전에는 Raja → Jai → Adithya 순서였던 데이터가, 정렬 후에는 이름 기준 알파벳 순서인 Adithya → Jai → Raja 순으로 변경된 것을 확인할 수 있습니다.

만약 내림차순으로 정렬하고 싶다면 return str2.compareTo(str1);처럼 비교 순서를 반대로 바꾸거나, Collections.reverse(list)를 호출하면 됩니다. 또한 숫자형 ID를 기준으로 정렬하려면 문자열이 아닌 Integer.parseInt() 등으로 값을 변환한 후 비교하면 됩니다.