본문 바로가기
Old Posts/Java

[Java] json-simple (JSONObject, JSONArray, JSONParser) 사용법 및 예제

by A6K 2021. 7. 23.

자바를 이용해 JSON 포맷으로 표현된 데이터를 손쉽게 다루기 위해서 'json-simple'이라는 라이브러리를 사용할 수 있다. 문자열 형태로 데이터를 표현하는 JSON 문서를 파싱하고 각 엘리먼터들을 손쉽게 접근하고 변경할 수 있다. 요즘 REST API 들이 데이터를 JSON 형태로 제공하는 경우가 많은데, 이 경우 JSON 형태의 문자열 데이터를 파싱해야할 필요가 생긴다.

json-simple 라이브러리 의존성

메이븐(Maven) 프로젝트를 사용하는 유저라면 간단하게 다음 의존성(Dependency)을 추가하면 json-simple 라이브러리를 사용할 수 있다. 일반 프로젝트라면 json-simple 라이브러리가 포함되어 있는 jar 파일을 프로젝트에 포함해야한다.

<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1.1</version>
</dependency>

라이브러리 버전은 적당한걸 사용하면 된다.

만약 그래들(Gradle) 프로젝트라면 다음 설정을 추가하면 된다.

// https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple
compile group: 'com.googlecode.json-simple', name: 'json-simple', version: '1.1.1'

마찬가지로 json-simple 라이브러리 버전은 적당한걸 사용하면 된다. (참고로 mvnrepository.com에 가면 다른 설정들도 찾아볼 수 있다. (링크 : mvnrepository.com))

JSONObject 사용법 및 예제

json-simple 라이브러리의 JSONObject 클래스를 이용해서 json 객체를 만들 수 있다.

JSONObject jsonObject = new JSONObject();

jsonObject.put("Name", "iPhone");
jsonObject.put("company", "Apple");
jsonObject.put("OS", "iOS");
jsonObject.put("category", "Phone");

System.out.println(jsonObject.toJSONString());

JSONObject 객체를 만들고 'put()' 메소드를 이용해서 데이터를 넣어줬다. 마지막에 'toJSONString()' 메소드를 이용해서 JSON 포맷 문자열 데이터로 만들어 준 것을 확인할 수 있다.

이 코드를 실행하면 다음 결과를 얻을 수 있다.

{"OS":"iOS","company":"Apple","category":"Phone","Name":"iPhone"}

이렇게 만들어진 json 데이터의 값들은 'put()' 메소드로 입력한 순서와 관계 없이 출력된다. JSONObject의 구현 코드를 열어보면 HashMap 클래스를 extends 하고 있음을 알 수 있다. 이 때문에 HashMap처럼 JSONObject에 추가한 엔트리 값의 순서는 보장이 되지 않는다. 

참고로 Intelli에서 이 코드를 작성하면 컴파일러 Warning을 보게 된다.

Unchecked call to 'put(K, V)' as a member of raw type 'java.util.HashMap'

 

앞서 JSONObject는 HashMap 클래스를 상속하고 있따고 했다. HashMap 클래스는 저장할 Key, Value 값의 타입을 제네릭으로 명시해줘야한다. 문제는 JSONObject 클래스가 제네릭으로 선언되지 않았기 때문에 Key, Value 값의 타입을 명시할 수 없다.

이럴 때는 다음처럼 코드를 작성하면 컴파일러 Warning을 우회할 수 있다.

HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("Name", "iPhone");
hashMap.put("company", "Apple");
hashMap.put("OS", "iOS");
hashMap.put("category", "Phone");
        
JSONObject jsonObject = new JSONObject(hashMap);
        
System.out.println(jsonObject.toJSONString());

JSONObject 객체를 생성할 때 HashMap 객체를 받을 수 있다. 이 HashMap 객체는 제네릭 선언이 가능하기 때문에 제네릭으로 HashMap 객체를 만들어주고 JSONObject 생성시 사용하면 된다.


JSONArray 사용법 및 예제

JSONArray는 JSON 객체의 배열이다. JSONObject가 JSON 객체를 다루는 역할을 했다면, JSONArray는 JSON 배열을 다루기 위한 클래스다.

HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("Name", "iPhone");
hashMap.put("company", "Apple");
hashMap.put("OS", "iOS");
hashMap.put("category", "Phone");
JSONObject iphone = new JSONObject(hashMap);

hashMap = new HashMap<>();
hashMap.put("Name", "Galaxy Note 9");
hashMap.put("company", "Samsung");
hashMap.put("OS", "Android");
hashMap.put("category", "Phone");
JSONObject galaxyNote9 = new JSONObject(hashMap);

JSONArray jsonArray = new JSONArray();
jsonArray.add(iphone);
jsonArray.add(galaxyNote9);

System.out.println(jsonArray.toJSONString());

여러개의 JSONObject 객체들을 만들어서 데이터를 설정하고 JSONArray 객체에 add() 메소드로 추가하면 JSONArray 객체를 생성할 수 있다.

이 코드를 실행하면 다음 결과를 얻게된다.

[{"company":"Apple","OS":"iOS","category":"Phone","Name":"iPhone"},
 {"company":"Samsung","OS":"Android","category":"Phone","Name":"Galaxy Note 9"}]

이 경우에도 JSONObject처럼 CompilerWarning이 뜨는데, @SuppressWarnings("unchecked") 어노테이션을 추가하면 Warning을 안 볼 수 있다. (JSONObject처럼 우회할 수 있는 방법이 있는지는 잘 모르겠다.. 아시는 분이 있으면 댓글로... ㅜㅜ)


JSONParser 사용법 및 예제

JSONObject 객체를 이용해서 JSON 문자열을 생성해봤다. 이제는 반대로 JSON 포맷의 문자열을 파싱해서 JSONObject로 생성, 자바 로직에서 데이터들을 사용해보는 예제를 작성해보자.

String jsonString = "{\"company\":\"Apple\",\"OS\":\"iOS\",\"category\":\"Phone\",\"Name\":\"iPhone\"}";

JSONParser jsonParser = new JSONParser();

try {
    Object result = jsonParser.parse(jsonString);
    
    if (result instanceof JSONObject) {
        JSONObject jsonObject = (JSONObject)result;
				
        // .. JSON 객체 처리
    }
    else if (result instanceof JSONArray) {
        JSONArray jsonArray = (JSONArray)result;

        // .. JSON 배열 처리
    }
} catch (ParseException e) {
    e.printStackTrace();
}

jsonString 변수에 담겨있는 JSON 포맷 문서를 JSONParser 객체의 parse() 메소드를 이용해서 파싱했다. 그 결과로 나온 객체는 Object 타입인데 이 객체는 JSONObject 객체일 수도 있고 JSONArray 객체일 수도 있다. instanceof 연산을 이용해 클래스를 파악하고 캐스팅해서 사용하면 된다. 

댓글