[Spring Boot] json 을 VO로 바꾸기 (ObjectMapper)

Posted by 김성철

Spring boot - JSONObject 를 VO로 변경하기

참고링크 : https://interconnection.tistory.com/137  
  
API를 사용하여 통신하다보면 응답을 JSON 으로 받을때가 있음  
이거를 VO로 변경해서 DB에값도 넣고, 가공한다음에 다시 사용하려고 할때에 사용하면 되는 방법임  

기존방법

생성자를 통해서 JsonObject 를 받은담에 셋팅.  
왜 이렇게 했었는지는 잘모르겠으나,, 유지보수하는 프로젝트에서는 이렇게 되어 있었음..  
  
=================================================================================================================  
  
public class JobVO{  
  
	public JobVO(JSONObject object) {  
		if(object.has("id")) {  
		  if(object.get("id") != JSONObject.NULL) {  
			this.id = object.getString("id");  
		  }  
		}  
  
		if(object.has("description")) {  
			if(object.get("description") == JSONObject.NULL) {  
				this.description = "";  
			} else {  
				this.description = object.get("description").toString();  
			}  
		}  
  
		if(object.has("result")) {  
			if(object.get("result") == JSONObject.NULL) {  
				this.result = "BUILD";  
			} else {  
				this.result = object.get("result").toString();  
			}  
		}  
  
		if(object.has("timestamp")) {  
			if(object.get("timestamp") != JSONObject.NULL) {  
				this.lastBuildDate = (long) object.get("timestamp");  
			}  
		}  
  
		if(object.has("disabled")) {  
			if(object.get("disabled") != JSONObject.NULL) {  
				this.archived = object.getBoolean("disabled");  
			}  
		}  
	}  
}  
=================================================================================================================  

ObjectMapper 사용

ObjectMapper 클래스를 통해서 JobVO로 변경하는 코드,  
configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) 옵션의 경우에는  
JSON에는 있지만 Mapping될 Object에는 없는 필드를 무시해야하는 경우  
	ex) 	JSON에는 number 필드가 있지만, VO에는 number이 없을경우 오류가 발생함. json과 매칭이 안되는 부분은 넘어갈 떄 사용  
  
=================================================================================================================  
  
ObjectMapper om = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);  
  
try{  
	JobVO jvo = om.readValue(JSONdata , JobVO.class)  
}catch (Exception e){  
	e.printstack()  
}  
  
=================================================================================================================  

Json 파일을 읽어서 Object로 변경하기 (jackson)

위에 작성한 예시들도 있지만 아래와 같이 jackson 라이브러리를 사용할 수 있음  
  
- 읽어오는 클래스  
=====================================================================  
import com.fasterxml.jackson.databind.ObjectMapper;  
import java.io.File;  
import java.io.IOException;  
import org.slf4j.Logger;  
import org.slf4j.LoggerFactory;  
  
public class JsonPropertyReader {  
	private static final Logger logger = LoggerFactory.getLogger(JsonPropertyReader.class);  
  
	public void readProperty(){  
		try {  
			ObjectMapper objectMapper = new ObjectMapper();  
			ConfigVO config = objectMapper.readValue(new File("src/main/resources/config.json"), ConfigVO.class);  
			System.out.println(config);  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
	}  
}  
  
=====================================================================  
  
- JSON 파일 내용  
=====================================================================  
{  
  "port" : 8080,  
  "host" : [  
	{  
	  "host_name" : "ahost",  
	  "home_directory" : "ahost",  
	  "error_page" : {  
		"error403" : "403.html",  
		"error404" : "404.html",  
		"error500" : "500.html"  
	  }  
	},  
	{  
	  "host_name" : "bhost",  
	  "home_directory" : "bhost",  
	  "error_page" : {  
		"error403" : "403.html",  
		"error404" : "404.html",  
		"error500" : "500.html"  
	  }  
	}  
  ]  
}  
=====================================================================  
  
- VO 내용  
=====================================================================  
import com.fasterxml.jackson.annotation.JsonProperty;  
  
import java.util.List;  
  
public class ConfigVO {  
  
	private List<Host> host;  
  
	private int port;  
  
	public List<Host> getHost() {  
		return host;  
	}  
  
	public void setHost(List<Host> host) {  
		this.host = host;  
	}  
  
	public int getPort() {  
		return port;  
	}  
  
	public void setPort(int port) {  
		this.port = port;  
	}  
  
	public static class Host {  
		@JsonProperty("error_page")  
		private ErrorPage errorPage;  
		@JsonProperty("home_directory")  
		private String homeDirectory;  
		@JsonProperty("host_name")  
		private String hostName;  
  
		public ErrorPage getErrorPage() {  
			return errorPage;  
		}  
  
		public void setErrorPage(ErrorPage errorPage) {  
			this.errorPage = errorPage;  
		}  
  
		public String getHomeDirectory() {  
			return homeDirectory;  
		}  
  
		public void setHomeDirectory(String homeDirectory) {  
			this.homeDirectory = homeDirectory;  
		}  
  
		public String getHostName() {  
			return hostName;  
		}  
  
		public void setHostName(String hostName) {  
			this.hostName = hostName;  
		}  
	}  
  
	public static class ErrorPage {  
		private String error500;  
		private String error404;  
		private String error403;  
  
		public String getError500() {  
			return error500;  
		}  
  
		public void setError500(String error500) {  
			this.error500 = error500;  
		}  
  
		public String getError404() {  
			return error404;  
		}  
  
		public void setError404(String error404) {  
			this.error404 = error404;  
		}  
  
		public String getError403() {  
			return error403;  
		}  
  
		public void setError403(String error403) {  
			this.error403 = error403;  
		}  
  
	}  
}  
=====================================================================  

Json 파일을 읽어서 Object로 변경하기 (gson)

※ 아래의 코드는 테스트 안해봄  
- 읽어오는 클래스  
=====================================================================  
import com.google.gson.Gson;  
import com.google.gson.annotations.SerializedName;  
import java.io.BufferedReader;  
import java.io.FileReader;  
import java.io.IOException;  
import java.util.List;  
import java.util.Map;  
  
public class JsonPropertyReader {  
	private static final Logger logger = LoggerFactory.getLogger(JsonPropertyReader.class);  
  
	public void readProperty(){  
		try {  
			Gson gson = new Gson();  
			BufferedReader bufferedReader = new BufferedReader(new FileReader("config.json"));  
			Config config = gson.fromJson(bufferedReader, Config.class);  
			bufferedReader.close();  
			System.out.println(config);  
		} catch (IOException e) {  
			e.printStackTrace();  
		}  
	}  
}  
  
=====================================================================  
  
- VO  
※ VO는 기존과 똑같으며 어노테이션만 @JsonProperty 에서 @SerializedName 로 변경  
=====================================================================  
import com.fasterxml.jackson.annotation.JsonProperty;  
  
import java.util.List;  
  
public class ConfigVO {  
  
	private List<Host> host;  
  
	private int port;  
  
	public List<Host> getHost() {  
		return host;  
	}  
  
	public void setHost(List<Host> host) {  
		this.host = host;  
	}  
  
	public int getPort() {  
		return port;  
	}  
  
	public void setPort(int port) {  
		this.port = port;  
	}  
  
	public static class Host {  
		@SerializedName("error_page")  
		private ErrorPage errorPage;  
		@SerializedName("home_directory")  
		private String homeDirectory;  
		@SerializedName("host_name")  
		private String hostName;  
  
		public ErrorPage getErrorPage() {  
			return errorPage;  
		}  
  
		public void setErrorPage(ErrorPage errorPage) {  
			this.errorPage = errorPage;  
		}  
  
		public String getHomeDirectory() {  
			return homeDirectory;  
		}  
  
		public void setHomeDirectory(String homeDirectory) {  
			this.homeDirectory = homeDirectory;  
		}  
  
		public String getHostName() {  
			return hostName;  
		}  
  
		public void setHostName(String hostName) {  
			this.hostName = hostName;  
		}  
	}  
  
	public static class ErrorPage {  
		private String error500;  
		private String error404;  
		private String error403;  
  
		public String getError500() {  
			return error500;  
		}  
  
		public void setError500(String error500) {  
			this.error500 = error500;  
		}  
  
		public String getError404() {  
			return error404;  
		}  
  
		public void setError404(String error404) {  
			this.error404 = error404;  
		}  
  
		public String getError403() {  
			return error403;  
		}  
  
		public void setError403(String error403) {  
			this.error403 = error403;  
		}  
  
	}  
}  
  
=====================================================================