[JAVA] JSON Array 형식의 문자열을 List 형식으로 변환하는 방법

2023. 4. 4. 18:47·Java & Spring
반응형

개요

사용자가 작성한 서식을 엑셀로 다운로드하는 부분을 개발하는데,

기존 프로젝트에는 QueryDsl에서 읽어 들일 때 JSON의 각 필드에 JSON_EXTRACT만 사용하여 나온 결과를

String 형식으로 저장 후 해당 문자열에 값이 있는지를 판별하는 식으로 작업되어 있었다.

 

중복 선택이 가능한 필드의 경우 배열에서 1 값을 찾을 때,

"[1, 2]"라는 문자열 내에 "1"이라는 문자가 있는지 확인하는 방식이다.

 

해당 방식의 가장 큰 단점은 저장해야 할 값이 10 이상일 때 발생하는데,

0~9 내에서는 문자가 중복되지 않아 기능 상으로는 문제가 없으나 10 이상의 값이 생기면 1을 찾을 때 10이라는 값이 있어도 true를 반환하게 되는 등의 이슈가 발생한다.

 

프로젝트를 개발하는 과정에서 해당 경우가 실제로 발생하여 기존 코드를 그대로 사용할 수 없어 수정 작업을 진행하였는데,

최초에 데이터베이스에서 값을 가져올 때 형식에 맞춰서 가져온다면 가장 좋겠지만

그러기에는 이미 작성된 코드의 양이 많아서 수정할 시간도 부족하고 사이드 이펙트도 감당이 되지 않았기 때문에

String으로 가져온 필드를 List 형식으로 변환한 후 stream을 통해 값을 찾는 빠른 방식을 채택하였다.

 

그러는 과정에서 JSON 형식의 String을 List로 변환하는 방법이 구글링 했을 때 생각보다 찾기 어려웠고,

별 거 아닌 작업이지만 추후에 비슷하게 또 시간을 지체할 수 있을 것 같아 포스팅으로 남기기로 결정했다.

코드

Java에서 JSON을 다룰 때에는 주로 org.json 라이브러리를 사용한다. 필자는 20180813 버전을 사용하였다.

// https://mvnrepository.com/artifact/org.json/json
implementation group: 'org.json', name: 'json', version: '20180813'

라이브러리를 설치하고 아래와 같이 코드를 작성한다.

import org.json.JSONArray;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        String field = "[1, 2, 3, 4, 5]"; // 변환할 문자열
        JSONArray jsonArray = new JSONArray(field); // field 값이 null인 경우 NPE
        List<Object> list = jsonArray.toList();

        int targetValue = 1;
        boolean isValueExists = list.stream().anyMatch(o -> o.equals(targetValue));

        if (isValueExists) {
            System.out.println("JSON 배열에 " + targetValue + " 값이 있습니다.");
        } else {
            System.out.println("JSON 배열에 " + targetValue + " 값이 없습니다.");
        }
    }
}

JSONArray를 변환할 String을 담아 생성하고 toList를 통해 List 형식으로 받아온다.

이후 stream의 anyMatch를 사용하여 값이 있는지를 판별할 수 있다.

 

참고) 아래는 List를 Integer 형식으로 받아오거나, toArray를 통해 int[] 형식으로 변환하여 사용하는 방법이다.

// List
List<Integer> integerList = list.stream()
    .map(o -> (Integer) o)
    .collect(Collectors.toList());

// int[]
int[] intArray = list.stream()
    .mapToInt(o -> (Integer) o)
    .toArray();
반응형

'Java & Spring' 카테고리의 다른 글

[JAVA] LocalDate로 한국식 월 주차 구하기  (6) 2023.07.27
[JAVA] Calendar로 한국식 월 주차 구하기  (0) 2023.07.24
[JAVA] Lombok Builder, SuperBuilder와 Generic 사용하기  (0) 2023.07.21
[JAVA] poi에서 SXSSFWorkbook 사용 시 NullPointerException이 발생하는 경우  (0) 2023.04.28
[JAVA] poi에서 엑셀을 다룰 때 발생하는 여러가지 오류  (1) 2023.04.05
'Java & Spring' 카테고리의 다른 글
  • [JAVA] Calendar로 한국식 월 주차 구하기
  • [JAVA] Lombok Builder, SuperBuilder와 Generic 사용하기
  • [JAVA] poi에서 SXSSFWorkbook 사용 시 NullPointerException이 발생하는 경우
  • [JAVA] poi에서 엑셀을 다룰 때 발생하는 여러가지 오류
hojun-dev
hojun-dev
개발과 함께하는 일상을 그리는 블로그입니다.
  • hojun-dev
    개발 일상
    hojun-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (69)
      • Java & Spring (15)
      • Kubernetes (17)
      • Javascript (2)
      • Linux (2)
      • Setting (16)
      • Work (4)
      • 일상 (10)
      • 항해플러스 (3)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
hojun-dev
[JAVA] JSON Array 형식의 문자열을 List 형식으로 변환하는 방법
상단으로

티스토리툴바