참고링크 : 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 클래스를 통해서 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()
}
=================================================================================================================
위에 작성한 예시들도 있지만 아래와 같이 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;
}
}
}
=====================================================================
※ 아래의 코드는 테스트 안해봄
- 읽어오는 클래스
=====================================================================
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;
}
}
}
=====================================================================