반응형
지난 포스트에 이어서 이 포스트에서는 JSON 데이터를 출력하는 기능에 대해 정리하겠습니다.
1. 실행결과
2. 구현방법
이 토이 프로젝트에서 JSON 데이터를 출력할 때는 Jackson라이브러리를 사용했습니다.
JSON을 다루는 Java라이브러리 중에서 실무에서 다루어 본 것은 Jackson, GSON이 있는데,
JSON을 파싱 할 때 대용량 데이터를 다루게 될 경우 Jackson이 GSON에 비해서 빠르기 때문입니다.
라이브러리 별 파싱 속도는 아래 링크된 블로그의 글에서 잘 정리된 것 같으니 참고하시면 좋을 것 같습니다.
http://www.yunsobi.com/blog/entry/java-json-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EB%B3%84-parser-%EC%86%8D%EB%8F%84-%EB%B9%84%EA%B5%90
이 토이 프로젝트에서는 파싱에 관련된 기능은 없지만
구상하고 있는 토이프로젝트 중 대용량의 JSON파싱 기능이 필요한 경우가 있으므로 겸사겸사 Jackson을 사용하게 되었습니다.
※ 아래 코드는 Java객체를 JSON 데이터로 변환하거나, JSON 데이터를 파싱 하는 유틸 클래스입니다.
package tools.utils;
/**
* JSON 데이터를 지정한 클래스(데이터를 담기위한 클래스) 형식으로 파싱,
* 또는 지정한 클래스에 담긴 데이터를 JSON형식으로 변환해주는 유틸클래스.
* 대용량 JSON데이터를 처리하는데 있어 유리한 jackson-databind를 사용했다.
* 이 코드를 사용하기 위해선 build.gradle에 아래의 의존성을 추가해주어야한다.
* // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind
* compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.2'
*
* @author lee-y
*
*/
public class JsonUtil {
public ObjectMapper mapper = new ObjectMapper();
private JsonUtil() {};
public static JsonUtil getInstance() {
return JsonUtilHolder.INSTANCE;
}
private static class JsonUtilHolder {
private static final JsonUtil INSTANCE = new JsonUtil();
}
/**
* Json 데이터를 파싱하기 위한 메소드.
*
* @param json : 파싱할 Json데이터
* @param template : 파싱한 데이터를 담기위한 클래스
* @return
*/
public Object makeObjFromJson(String json, Class<?> template) {
if (json == null) return null;
Object res = null;
try {
res = mapper.readValue(json, template);
} catch (JsonProcessingException e) { e.printStackTrace(); }
return res;
}
/**
* 지정한 데이터 클래스에 담긴 데이터를 Json형식의 문자열 데이터로 변환해주는 기능.
*
* @param obj : : Json으로 변환하기 위한 데이터 클래스
* @return : Json 문자열을 리턴한다.
*/
public String makeJsonFromObj(Object obj) {
if (obj == null) return null;
String res = null;
try {
res = mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) { e.printStackTrace(); }
return res;
}
/**
* 지정한 데이터 클래스에 담긴 데이터를 Json형식의 byte[]데이터로 변환해주는 기능.
*
* @param obj : : Json으로 변환하기 위한 데이터 클래스
* @return : byte[]를 리턴한다.
*/
public byte [] makeJsonByteFromObj(Object obj) {
if (obj == null) return null;
byte [] res = null;
try {
res = mapper.writeValueAsBytes(obj);
} catch (JsonProcessingException e) { e.printStackTrace(); }
return res;
}
/**
* 지정한 데이터 클래스에 담긴 데이터를 Json형식의 File로 변환해주는 기능.
*
* @param obj : : Json으로 변환하기 위한 데이터 클래스
*/
public void makeJsonByteFromObj(Object obj, String filePath) {
if (obj == null || filePath == null || filePath.equals("")) return ;
File f = null;
try {
f = new File(filePath);
mapper.writeValue(f, obj);
} catch (IOException ie) { ie.printStackTrace(); }
}
}
※ 위의 유틸 클래스의 메서드를 ItemDataOutputJson.java에서 사용하여 Item객체를 Json데이터로 변환하여 파일로 출력합니다.
package tools.dataoutput;
public class ItemDataOutputJson extends ItemDataOutput {
private JsonUtil jsonUtil = JsonUtil.getInstance();
public ItemDataOutputJson() {
super();
Properties prop = new Properties();
InputStream is = null;
try {
is = ItemDataOutput.class.getClassLoader().getResourceAsStream("config.dataoutput.properties");
prop.load(is);
super.OUTPUT_DIR = prop.getProperty("output.dir.dataoutput.json");
super.OUTPUT_FILE_NAME = prop.getProperty("output.filename.dataoutput.json");
super.EXTENTION = ".json";
super.ENCODING_TYPE = prop.getProperty("encodingtype.dataoutput.json");
} catch (Exception e) {
System.out.println("Properties load fail!!");
}
}
@Override
public void outputDataToFile(List<Item> list, int processNum) {
String outputFilePath = makeFileName(processNum);
try (BufferedWriter bw = Files.newBufferedWriter(
Paths.get(outputFilePath),
Charset.forName(ENCODING_TYPE),
StandardOpenOption.CREATE_NEW)) {
StringBuffer sb = new StringBuffer();
int size = list.size();
sb.append("[");
for (int i=0; i < size; i++) {
Item item = list.get(i);
sb.append(jsonUtil.makeJsonFromObj(item));
sb.append( (i == size-1) ? "" : ",");
}
sb.append("]");
bw.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
반응형
'프로그래밍 > Java-토이프로젝트' 카테고리의 다른 글
서버 상태 확인 시각화 툴(vmstat,sar와 같은 명령어의 결과 차트화)-1【전체구조와 설계】 (0) | 2021.07.12 |
---|---|
데이터 출력(DB -> json,xml등) 프로그램-3【XML출력】 (1) | 2021.05.23 |
데이터 출력(DB -> json,xml등) 프로그램-1【전체구조】 (0) | 2021.05.22 |
파일 인코딩 변환 프로그램 (0) | 2021.05.14 |
계산기 (계산식을 입력 받아 처리) (0) | 2021.05.09 |
댓글