본문 바로가기
공부/프로그래밍

String형 Json 값을 JSON 으로 변환 후 클래스(DTO)에 매핑하기

by demonic_ 2018. 1. 9.
반응형

참조한 문서: ModelMapper

http://modelmapper.org/user-manual/jackson-integration/


필요한 repository



	org.modelmapper
	modelmapper
	1.1.0


	org.modelmapper.extensions
	modelmapper-jackson
	1.1.0




	com.googlecode.json-simple
	json-simple
	1.1


JAVA 쪽 코드

import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.modelmapper.ModelMapper;
import org.modelmapper.convention.NameTokenizers;
import org.modelmapper.jackson.JsonNodeValueReader;

// 여기서는 정적 메서드로 생성.
public class JsonUtil(){
	// string 형의 JSON 값을 파싱	
	static JSONParser jsonParser;
	static ModelMapper modelMapper;

	/** 초기화 */
	static
	{
	    modelMapper = new ModelMapper();
	    modelMapper.getConfiguration().addValueReader(new JsonNodeValueReader());
	    modelMapper.getConfiguration().setSourceNameTokenizer(NameTokenizers.UNDERSCORE);
	    jsonParser = new JSONParser();
	}


	/**
	 * json 형태의 텍스트를 클래스로 변환하여 리턴
	 * @param jsonStr
	 *          json 포멧으로 되어있는 string(문자)
	 * @param obj
	 *          JSON 값을 매핑할 클래스
	 *
	 * 참조:
	 * - Jackson Integration (ModelMapper)
	 * http://modelmapper.org/user-manual/jackson-integration/
	 * - 문서상으로는 jsonNode 를 처리하도록 했는데, JSON의 형태가 2dept 이상 넘어가면 다음의 에러 생성
	 *      : at org.modelmapper.internal.Errors.throwMappingExceptionIfErrorsExist(Errors.java:374)
	 *  그래서 JsonNode 대신에 JSONObject 로 사용함.
	 */
	public static Object convertJsonStrToClass(String jsonStr , Class obj){
	    try {
	        JSONObject jsonObj = (JSONObject) jsonParser.parse(jsonStr);
	        return modelMapper.map(jsonObj, obj);
	    } catch (ParseException e) {
	        e.printStackTrace();
	        return null;
	    }
	}
}


테스트 코드

// 반드시 따옴표로 해야하고 ' << 작은 따옴표를 하는경우 에러가 발생
String testJson = "{\"test\":\"test123\",\"code\":\"CD001\"}";
// HashMap 형태로 받기로 수정
HashMap test = (HashMap) JsonUtil.convertJsonStrToClass(testJson, HashMap.class);

System.out.println(test);
=> 결과값: {code=CD001, test=test123}


반응형

댓글