참고글
JSON
JSON은 JavaScript Object Notation 의 줄임말로 말 그대로 자바스크립트에서 객체를 표현하는 방법입니다.
var obj = { "name" : "kim", "age" : 29 }; |
cs |
원래는 자바스크립트 언어에서 객체를 정의할 때 사용하는 문법, 규칙이었는데, key-value 방식으로 데이터를 표현하거나 이해하는데 직관적이고 규칙도 간단하여 여러 언어나 통신에서 사용되게 되었습니다. JSON은 네이버나 구글같은 플랫폼 기업에서 제공하는 공개 API에서도 XML과 같이 사용되고 있습니다.
JSON은 데이터를 표현하는 규칙(RFC 7159에 정의)만 지켜주면 되기때문에 어떤 언어, 어떤 플랫폼에서든지 사용 가능하며, 거의 대부분의 언어에서 자체적으로 JSON을 다룰 수 있는 API를 제공하거나 자체 API가 없더라도 오픈 소스 라이브러리를 제공하는 추세입니다.
JSON을 표현하는 자세한 규칙은 참고글을 읽어주시기 바랍니다.
JAVA에서 JSON을 다루기. google의 json-simple
JAVA 플랫폼에서도 JSON을 쉽게 다룰 수 있는 여러가지 오픈소스 라이브러리가 있는데, 이번글에서는 그 중 google에서 제공하는 json-simple 라이브러리를 알아보도록 하겠습니다.
라이브러리 다운로드 및 어플리케이션에 설정하기
개발하는 프로젝트에 json-simple.jar 라이브러리를 다운받고 설정해 두어야 합니다.
Maven을 이용하는 경우
Maven을 이용하는 경우 매우 간단하게 pom.xml에 아래와 같이 의존 설정을 해두면 됩니다.
<!-- 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>
독립형 Java 어플리케이션 또는 JAVA 웹 어플리케이션 환경인 경우
이 두 경우에도 Maven을 이용할 수 있지만 Maven을 사용하지 않는 경우 직접 라이브러리를 내려받고 classpath 경로에 라이브러리를 넣어두어야 합니다.
1. 다음의 주소에 접근합니다.
2. 라이브러리 파일(.jar) 를 내려받습니다.
3-A. 웹 환경인 경우 웹 어플리케이션 경로의 WEB-INF/lib/ 하위에 라이브러리를 넣습니다.
3-B. 독립형 java 어플리케이션인 경우에는 컴파일 또는 실행시 -cp 옵션을 통해 classpath로 라이브러 파일을 지정해주거나, 다음의 경로에 라이브러리 파일을 넣어둡니다.
-
[JAVA JDK 설치 경로]\jre\lib\ext
-
[JAVA JRE 설치 경로]\lib\ext
두 경로에 라이브러리가 없거나 클래스패스로 지정해주지 않는 경우 ClassNotFoundException이나, NoClassDefFoundError가 발생할 수 있습니다.
3-C. 이클립스 프로젝트에서 라이브러리를 추가 하는 방법은 아래 글을 참고해주세요. (간단합니다)
json-simple 간단 사용법
라이브러리를 다운받고 설정해 두었다면 이제 JAVA에서도 JSON을 다룰 수 있습니다.
json-simple에서는 JAVA와 JSON의 값들을 다음과 같이 맵핑하여 사용됩니다.
JSON value |
JAVA 클래스 |
설명 |
string |
java.lang.String |
JSON의 문자열은 String 타입으로 맵핑 |
number |
java.lang.Number |
JSON의 숫자는 Number(Integer, Float...등)의 래퍼타입으로 맵핑 |
null |
null |
null은 자바에서의 null값 |
boolean |
Boolean |
true, false를 표현하는 Boolean 래퍼 클래스 |
배열 |
java.util.List |
JSON에서의 배열인 '[]' 표기법은 List로 표현.
(실제로는 List를 구현한 JSONArray로 맵핑됨) |
객체 |
java.util.Map | JSON에서의 객체인 '{}' 표기법은 key-value 형식인 Map으로 표현. (실제로는 Map을 구현한 JSONObject로 맵핑됨) |
JSON 형식의 TEXT -> JAVA 객체로 변환하는 방법
아래와 같은 JSON 텍스트 데이터가 있습니다.
{"isMarried":false,"address":null,"name":"kim","age":19} |
cs |
웹 환경이라면 브라우저에서 AJAX를 통해 톰캣같은 WAS로 보내온 데이터일 수 있고 독립형 JAVA라면 JSON 데이터를 담은 파일을 입력 스트림으로부터 읽어온 데이터일 수 있습니다.
어쨌든 텍스트이니 높은 확률로 String 값임에는 분명할 것입니다.
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
public class JsonToJavaTest {
public static void main(String[] args) {
String jsonText = "{\"isMarried\":false,\"address\":null,\"name\":\"kim\",\"age\":19}";
JSONParser parser = new JSONParser();
JSONObject obj = null;
try {
obj = (JSONObject)parser.parse(jsonText);
} catch (ParseException e) {
System.out.println("변환에 실패");
e.printStackTrace();
}
System.out.println(obj);
System.out.println(obj.get("name"));
System.out.println(obj.get("isMarried"));
}
} |
cs |
jsonText는 JSON 데이터를 담은 String 객체입니다. JAVA에서 " 를 표현하려면 \" 와 같이 이스케이프 처리를 해주어야 하기 때문에 조금은 복잡해 보이는데, 앞서 소개한 데이터입니다.
어쨌거나 JSON 데이터를 자바 객체로 변환하기 위해서는 기본적으로 JSONParser#parse(String json) 메서드를 사용할 수 있습니다. 변환에 실패하는 경우 ParseException을 던지기 때문에 예외처리를 해주어야 합니다.
JSONParser parser = new JSONParser();
JSONObject obj = null;
try {
obj = (JSONObject)parser.parse(jsonText);
} catch (ParseException e) {
System.out.println("변환에 실패");
e.printStackTrace();
} |
cs |
변환에 성공하면 Object를 리턴하므로 단순 객체인경우 JSONObject나 배열인 경우 JSONArray로 캐스팅 해주어야 합니다.
obj = (JSONObject)parser.parse(jsonText); |
cs |
JSONObject는 java.util.Map의 구현체이므로 원하는 값의 key를 가지고 값을 얻을 수 있습니다.
System.out.println(obj);
System.out.println(obj.get("name"));
System.out.println(obj.get("isMarried")); |
cs |
출력 결과
{"isMarried":false,"address":null,"name":"kim","age":19}
kim
false |
cs |
만약 원본 데이터가 배열인 경우는 다음과 같이 사용하면 됩니다.
[{"name":"kim"}, {"name":"lee"}] |
cs |
JSON 배열은 JSONArray로 표현되며, java.util.List의 구현체이므로 get(int index) 를 통해 값을 얻을 수 있습니다.
String jsonText = "[{\"name\":\"kim\"}, {\"name\":\"lee\"}]";
JSONParser parser = new JSONParser();
JSONArray arr = null;
try {
arr = (JSONArray)parser.parse(jsonText);
} catch (ParseException e) {
System.out.println("변환에 실패");
e.printStackTrace();
}
System.out.println(arr);
System.out.println(arr.get(0));
System.out.println(arr.get(1)); |
cs |
출력 결과
[{"name":"kim"},{"name":"lee"}]
{"name":"kim"}
{"name":"lee"} |
cs |
JAVA 객체 -> JSON 형식의 TEXT로 변환하는 방법
반대로 JAVA에서 데이터를 가공하여 JSON 형태의 문자열로 변환하는 방법을 알아보도록 하겠습니다. 다음과 같은 JSON 데이터를 만들어 볼 것입니다.
[{"isMarried":false,"address":null,"name":"kim","age":19},{"isMarried":true,"address":"seoul","name":"lee","age":22}] |
cs |
JSONObject는 Map이고, JSONArray가 List라는 점만 염두해두면 별다른 어려움 없이 JSON을 다룰 수 있습니다.
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
public class JavaToJson {
public static void main(String[] args) {
JSONObject obj1 = new JSONObject();
obj1.put("name", "kim");
obj1.put("age", 19L);
obj1.put("address", null);
obj1.put("isMarried", false);
JSONObject obj2 = new JSONObject();
obj2.put("name", "lee");
obj2.put("age", 22L);
obj2.put("address", "seoul");
obj2.put("isMarried", true);
JSONArray arr = new JSONArray();
arr.add(obj1);
arr.add(obj2);
System.out.println(obj1.toJSONString());
System.out.println(obj2.toJSONString());
System.out.println(arr.toJSONString());
}
} |
cs |
만들어둔 JSON 객체를 문자열 데이터로 변경할때는 toJSONString() 메서드를 사용하면 됩니다.
obj1.toJSONString() |
cs |
출력결과
{"isMarried":false,"address":null,"name":"kim","age":19}
{"isMarried":true,"address":"seoul","name":"lee","age":22}
[{"isMarried":false,"address":null,"name":"kim","age":19},{"isMarried":true,"address":"seoul","name":"lee","age":22}] |
cs |
마무리
JSON은 표현규칙이 간단하고 객체를 표현 한다는 점에서 자바와 잘 맞으므로 라이브러리의 API 사용법도 자바의 기초만 안다면 매우 쉽다는 사실을 알 수 있습니다. JAVA에는 더욱 강력한 JSON 관련 라이브러리들이 많으니 그런 라이브러리들도 프로젝트에 이용하면 좋을 것 같습니다.