[java] 자바에서 JSON 데이터의 중복값 제거하기

자바에서 JSON 데이터를 다룰 때 중복값을 제거하는 방법을 알아보겠습니다.

1. Gson 라이브러리 추가

먼저, Gson 라이브러리를 프로젝트에 추가해야 합니다. Gson은 Google이 제공하는 JSON 데이터 처리를 위한 라이브러리입니다.

Maven을 사용하는 경우, pom.xml 파일에 다음 의존성을 추가합니다:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

Gradle을 사용하는 경우, build.gradle 파일에 다음 의존성을 추가합니다:

implementation 'com.google.code.gson:gson:2.8.6'

의존성을 추가한 후에는 해당 라이브러리를 import 해야 합니다:

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

2. 중복값 제거하기

JSON 데이터에서 중복값을 제거하기 위해서는 다음과 같은 알고리즘을 사용할 수 있습니다:

  1. JSON 데이터를 파싱하여 JsonArray나 JsonObject로 변환합니다.
  2. 중복값을 제거하기 위해 Set을 사용합니다.
  3. JsonArray나 JsonObject를 순회하며 중복값을 Set에 추가합니다.
  4. Set에 있는 값을 다시 JsonArray나 JsonObject로 변환합니다.
  5. 변환한 결과를 다시 JSON으로 직렬화합니다.

다음은 이 알고리즘을 구현한 예제 코드입니다:

public static String removeDuplicateValues(String json) {
    Gson gson = new Gson();
    JsonElement element = gson.fromJson(json, JsonElement.class);
    
    if (element.isJsonObject()) {
        JsonObject jsonObject = element.getAsJsonObject();
        removeDuplicateValues(jsonObject);
        return gson.toJson(jsonObject);
    } else if (element.isJsonArray()) {
        JsonArray jsonArray = element.getAsJsonArray();
        removeDuplicateValues(jsonArray);
        return gson.toJson(jsonArray);
    }
    
    return json;
}

private static void removeDuplicateValues(JsonArray jsonArray) {
    Set<JsonElement> uniqueElements = new HashSet<>();
    
    Iterator<JsonElement> iterator = jsonArray.iterator();
    while (iterator.hasNext()) {
        JsonElement element = iterator.next();
        if (!uniqueElements.add(element)) {
            iterator.remove();
        }
    }
    
    for (JsonElement element : uniqueElements) {
        if (element.isJsonObject()) {
            removeDuplicateValues(element.getAsJsonObject());
        } else if (element.isJsonArray()) {
            removeDuplicateValues(element.getAsJsonArray());
        }
    }
}

private static void removeDuplicateValues(JsonObject jsonObject) {
    for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
        JsonElement element = entry.getValue();
        if (element.isJsonObject()) {
            removeDuplicateValues(element.getAsJsonObject());
        } else if (element.isJsonArray()) {
            removeDuplicateValues(element.getAsJsonArray());
        }
    }
}

위의 코드를 사용하면 입력으로 주어진 JSON 데이터에서 중복값이 제거된 JSON 데이터를 반환할 수 있습니다.

3. 사용 예제

다음은 위에서 구현한 코드를 사용하는 예제입니다:

public static void main(String[] args) {
    String json = "{\"items\":[{\"id\":1,\"name\":\"Apple\"},{\"id\":2,\"name\":\"Banana\"},{\"id\":1,\"name\":\"Apple\"}]}";
    String result = removeDuplicateValues(json);
    System.out.println(result);
}

위의 예제를 실행하면, 중복된 아이템이 제거된 JSON 데이터가 출력됩니다:

{"items":[{"id":1,"name":"Apple"},{"id":2,"name":"Banana"}]}

참고 자료