본문 바로가기

JAVA

[JAVA] Jackson library - 1

반응형

지난 챕터에서 content-type이 application/json 이란것, 즉 통신 대상 데이터가 json 형태라는 것을 알게되었다.

 

json parsing 을 위해 jackson library 를 사용해보자

 

1. jar files download

 

- Jackson Core : https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core

- Jackson Databind : https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind

- Jackson Annotations : https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations

 

jackson-*-2.12.3.jar 기준으로 설치함

 


2. put files to WEB-INF/lib

 


3. parsing

 

먼저 import 한 리스트이다.

 

import java.util.ArrayList;
import java.util.List;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

 

전달 받는 json data를 String 형태로 테스트 값을 넣어주고, 구조화 된 데이터 클래스도 생성했다.

 

/*		1.	test input 생성		*/
StringBuilder sb = new StringBuilder();
String input = ""; 

sb.append("{\"data\":");
sb.append("[{\"cust_name\":\"Tom\",\"cust_age\":30,\"cust_gender\":\"M\"},");
sb.append("{\"cust_name\":\"Jane\",\"cust_age\":26,\"cust_gender\":\"W\",\"cust_phone\":\"010-1111-2222\"}]}");
		
input = sb.toString();
		
System.out.println("input : " + input);
public class Customer {
	private String cust_name;
	private int cust_age;
	private String cust_gender;	// W: Woman, M: Man
	private String cust_phone;
	
	public String getCust_name() {
		return cust_name;
	}
	public void setCust_name(String cust_name) {
		this.cust_name = cust_name;
	}
	public int getCust_age() {
		return cust_age;
	}
	public void setCust_age(int cust_age) {
		this.cust_age = cust_age;
	}
	public String getCust_gender() {
		return cust_gender;
	}
	public void setCust_gender(String cust_gender) {
		this.cust_gender = cust_gender;
	}
	public String getCust_phone() {
		return cust_phone;
	}
	public void setCust_phone(String cust_phone) {
		this.cust_phone = cust_phone;
	}
	
	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();

		sb.append("name : ");
		sb.append(getCust_name());
		sb.append(", ");
		sb.append("age : ");
		sb.append(getCust_age());
		sb.append(", ");
		sb.append("gender : ");
		sb.append(getCust_gender());
		sb.append(", ");
		sb.append("phone : ");
		sb.append(getCust_phone());
		
		return sb.toString();
	}
}

 


다음으로 ObjectMapper의 readValue 함수를 통해 key = data의 value값을 트리 형태로 파싱한다.

 

방법은 두가지이다.

 

// # 1
customers = mapper.readValue(jsonNode.get("data").toString(), new TypeReference<List<Customer>>(){});
// # 2
customers = mapper.readValue(jsonNode.get("data").toString(), mapper.getTypeFactory()
            .constructCollectionType(List.class, Customer.class));

 

전체 파싱 코드는 다음과 같다.

 

/*		2. root node 조회		*/
ObjectMapper mapper = new ObjectMapper();
JsonNode jsonNode = null;
List<Customer> customers = new ArrayList<Customer>();
		
try {
	jsonNode = mapper.readTree(input);

	if(!jsonNode.isNull()) {
		System.out.println("root : " + jsonNode.get("data") + "\n");
				
		// # 1
		customers = mapper.readValue(jsonNode.get("data").toString(),
				new TypeReference<List<Customer>>(){});
				
				
		// # 2
		customers = mapper.readValue(jsonNode.get("data").toString(), 
				mapper.getTypeFactory().constructCollectionType(
                List.class, Customer.class));
				
		for(Customer ct : customers) {
			System.out.println(ct + "\n");
		}
	}					
} catch (JsonMappingException e) {
	e.printStackTrace();
} catch (JsonProcessingException e) {
	e.printStackTrace();
}

 

트리의 루트는 다음과 같이 구성된다.

 

 

클래스화 된 데이터를 출력 시 결과는 다음과 같다.

 

 


지금 내가 운영하는 시스템에서 기존엔 간단한 단순 플래그 값만을 전달받아 json 형태로 주고 받지 않았던 걸로 보인다.

사용자 정보와 같은 구조화된 데이터를 주고 받는 현재의 API를 개발하면서 역직렬화(json -> java class)와 직렬화(java class <-> json)가 필요해졌고, 해당 부분을 jackson library를 이용하여 개발하였다. 

반응형

'JAVA' 카테고리의 다른 글

[JAVA] Jackson library - 0  (0) 2021.05.30
[JAVA] Priority Queue  (0) 2020.01.30
[JAVA] Map  (0) 2019.11.09
[JAVA] Set  (0) 2019.11.09
[JAVA] List  (0) 2019.11.09