JSON 라이브러리 Jackson/GSON 비교

Z_no.on·2022년 3월 13일
6
post-thumbnail

REST API란 쉽게 말해서 자원의 이름으로 자원의 상태를 주고받을 수 있는 API이다.

JSON 이나 XML 을 사용해서 데이터(자원)를 주고받는 것이 일반적이다.

개발원에서는 객체를 JSON형식으로 변환하거나 JSON을 다시 파싱할 때 Jackson 라이브러리를 사용했었는데, 회사에서는 GSON을 사용해보라고 했다.

그냥 익숙한 Jackson objectMapper를 사용하고 싶었지만, 어쩔 수 없이 GSON도 공부할겸...
두 개를 비교해서 정리했다.

Jackson

Jackson은 JSON뿐만 아니라 XML도 지원하는 라이브러리이다.

스프링을 배우기 전에는 JAVA객체를 JSON으로 변환할 때 직렬화(serializing) 하고 마샬링을 해줘야 했는데, Jackson ObjectMapper를 사용하면 객체를 한 방에 JSON화 할 수 있어서 엄청 편했다.

직렬화 (JAVA객체 => JSON형식)

우선 Jackson에서 직렬화 하는 방법이다.

ObjectMapper mapper = new ObjectMapper();

// string으로 직렬화
String jsonResult = mapper.writeValueAsString(boardVO); // boardVO => json으로 바꾸고싶은 java객체

// json 파일로 저장
mapper.writeValue(new File("src/resources/result.json"), boardVO);

// byte 배열로 저장
byte[] jsonBytes = mapper.writeValueAsBytes(boardVO);

이렇게 ObjectMapper객체를 만들고 writeValueAsString() 하게 되면, ( )안에 있는 JAVA객체를 JSON 형식의 스트링 문자열로 변환해준다. string 외에도 파일이나 바이트 배열로 저장할 수 있다.

역직렬화 (JSON형식의 데이터 => JAVA객체)

다음은 JSON형식의 데이터를 JAVA로 변환하는 역직렬화 방법이다.

ObjectMapper mapper = new ObjectMapper();

// JSON 파일에서 읽기
BoardVO boardVO = mapper.readValue(new File("src/resources/data.json"), boardVO.class);

// String 으로 읽기
BoardVO boardVO = mapper.readValue("{\"id\":\"a001\", \"name\":홍길동}", boardVO.class);

이처럼 readValue()로 JSON형식의 데이터를 읽을 수 있다.

boardVO 대신에 저장할 Java 객체를 넣어주면 된다.

List나 Map 형식으로 변환하고 싶으면 아래처럼 TypeReference를 사용하면 된다.

// List 형식
String jsonArray = 
  "[{ \"id\" : \"a001\", \"name\" : \"홍길동\" }, { \"id\" : \"b001\", \"name\" : \"지눈쓰\" }]";
  
List<BoardVO> listBoard = objectMapper.readValue(jsonArray, new TypeReference<List<BoardVO>>(){});

// Map 형식
String json = "{ \"id\" : \"a001\", \"name\" : \"홍길동\" }";

Map<String, Object> map 
  = objectMapper.readValue(json, new TypeReference<Map<String,Object>>(){});

Jackson은 고용량의 JSON데이터를 처리할 때 GSON보다 성능이 좋다고 한다.

GSON

GSON은 구글에서 만들었으며, 이름에서도 알 수 있듯이 딱 JSON형식만 처리할 수 있는것 같다.

가벼운 JSON 데이터를 처리할 때 성능이 좋다고 한다.

직렬화

GSON에서 Java객체를 문자열로 직렬화 하는 방법이다.

String jsonResult = new Gson().toJson(boardVO);

이렇게 Gson객체를 만들고 toJson( )하면 간단하게 JAVA객체를 JSON형식의 문자열로 변환할 수 있다.

역직렬화

다음은 역직렬화이다.

String jsonInput = "json 형식의 string 데이터";
BoardVO boardVO = new Gson().fromJson(jsonInput, boardVO.class);

똑같이 Gson객체 만들고 fromJson( )에 JSON 형식의 문자열 데이터만 넣어주면 된다.

JSON객체 생성하고 JSON형식의 문자열로 변환 예시

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

public class GsonExample {

	public static void main(String[] args) {
    
		Gson gson = new Gson();
		// Json 객체생성 (key, value 추가)
		JsonObject jsonObject = new JsonObject();
		jsonObject.addProperty("id", "a001");
		jsonObject.addProperty("name", "홍길동");
		// JsonObject를 Json 문자열로 변환(직렬화)
		String jsonStr = gson.toJson(jsonObject);
		// 생성된 Json 문자열 출력
		System.out.println(jsonStr); // {"id":"a001","name":홍길동}
        
	}
    
}

JsonObject 객체를 생성후 프로퍼티를 추가하고 이를 문자열로 직렬화했다.

JSON형식의 문자열을 Java 객체로 변환 예시

import com.google.gson.Gson;

public class JsonToObject {

	public static void main(String[] args) {

		// Json 문자열
		String jsonStr = "{\"id\":a001,\"name\":\"홍길동\"}";
		// Gson 객체 생성
		Gson gson = new Gson();
		// Json 문자열 -> VO 객체
		BoardVO boardVO = gson.fromJson(jsonStr, BoardVO.class);
		
	}
    
}

VO가 아니라 Map 형식도 똑같이 하면 된다.

공부해보니까 Jackson이나 GSON이나 사용법은 비슷비슷한거같다.

걍 더 편한거 쓰면 될듯

profile
안녕 난 지눈쓰

0개의 댓글