반응형
1. 설명
이 포스트에서 다룰 예제는 DTO, VO와 같은 데이터가 담기는
"클래스의 객체를 JSON형식의 데이터로 변환" (=직렬화: Serialization)해주는 코드입니다.
제가 경험한 업무에서 데이터 객체를 JSON으로 변환하는 데 필요한 경우는
아래와 같은 흐름의 프로그램을 만들어할 때 였습니다.
1) DB 또는 파일의 원본 데이터 -> 2) 데이터 클래스의 객체에 데이터 매핑 -> 3) JSON변환 -> 4) API에 HTTP 요청시JSON을 Request Body에 넣고 요청
예제코드 구현은 대용량 JSON데이터를 처리하는데 있어 유리한 jackson-databind를 사용해서 구현했습니다
2. 소스코드
- 메서드
/**
* Object -> JSON Str
*
* @param obj : : Json으로 변환하기 위한 데이터 클래스
* @return : Json 문자열을 리턴한다.
*/
public String ObjToJson(Object obj) {
if (obj == null) return null;
String res = null;
try {
res = mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) { e.printStackTrace(); }
return res;
}
/**
* Object -> JSON File
*
* @param obj : Json으로 변환하기 위한 데이터 클래스
* @param filePath : 출력할 JSON파일 경로
* @return : 생성된 파일 객체 리턴
*/
public File ObjToJson(Object obj, String filePath) {
if (obj == null || filePath == null || filePath.equals("")) return null;
File f = null;
try {
f = new File(filePath);
mapper.writeValue(f, obj);
} catch (IOException ie) { ie.printStackTrace(); }
return f;
}
Gradle 기준 아래의 의존성을 추가해 주셔야 예제코드가 동작합니다.
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.11.2'
- Object
public class Item {
private int itemId;
private String itemName;
private int itemPrice;
private boolean sales;
private List<String> images;
private List<StockHistory> stockHistory;
private String joinDate;
->
{
"itemId": 0,
"itemName": "testItem0",
"itemPrice": 0,
"sales": true,
"images": [
"testItem-img1.png",
"testItem-img2.png",
"testItem-img3.png"
],
"stockHistory": [
{
"stockHistoryNo": 1,
"count": 2,
"receivingDate": 1631929893268
},
{
"stockHistoryNo": 2,
"count": 4,
"receivingDate": 1631929893268
},
{
"stockHistoryNo": 3,
"count": 6,
"receivingDate": 1631929893268
}
],
"joinDate": "2021-09-18"
}
JSON에서 사용가능한 데이터 타입을 Java Class에서는 위와같이 매핑할 수 있습니다.
※ JSON데이터에서 사용가능한 데이터 타입
숫자(number) | 정수(소수부분이 없는 수) / 실수(소수부분이 있는 수) / 지수 (매우 큰 수나 작은 수를 표현시에 e 표기법을 사용) |
문자열(string) | 큰 따옴표로 둘러 싸인 문자의 집합, 특수문자 표현시에는 이스케이프 문자를 사용해야함 |
불리언(boolean) | 참과 거짓을 표현, 소문자 true, false만이 사용가능 |
객체(object) | 데이터명과 값으로 구성된 집합. |
배열(array) | 여러개의 데이터가 나열된 집합. |
null | 빈값을 표현 |
※ Java Object를 JSON으로 변환 할때 주의점
- 클래스의 멤버변수의 Getter메서드를 생성해주어야 합니다. (반대로 JSON -> Java Object로 변환 할 경우 Setter메서드를 생성해 주어야합니다.)
- 메인
public class Data_01_JsonMake {
static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
static JsonUtil ju = JsonUtil.getInstance();
static FileUtil fu = new FileUtil();
public static void main(String[] args) {
try {
for (String str : args ) {
System.out.println("Param : "+str);
}
/**
* Object -> JSON
*/
Item item = getItem(0);
ju.ObjToJson(item, args[0]);
System.out.println(fu.readPerLine(new File(args[0])));
/**
* List<Object지정> -> JSON 리스트
*/
List<Item> items = getItems();
// (1)
// String jsonContents = ju.ObjToJson(items);
// makeJson(args[1], jsonContents);
// System.out.println(jsonContents);
// (2)
ju.ObjToJson(items, args[1]);
System.out.println(fu.readPerLine(new File(args[1])));
System.exit(0);
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
private static void makeJson(String path, String ...strs) {
List<String> jsonFileContents = Arrays.asList(strs);
fu.writePerLine(new File(path), jsonFileContents);
}
private static Item getItem(int i) {
Item item = new Item();
item.setItemId(i);
item.setItemName("testItem"+i);
item.setItemPrice(Integer.parseInt(i+"000"));
item.setSales(true);
List<String> itemImages = new ArrayList<String>();
for (int z=1; z<=3; z++) {
itemImages.add("testItem-img"+z+".png");
}
item.setImages(itemImages);
List<StockHistory> itemStocks = new ArrayList<StockHistory>();
for (int j=1; j<=3; j++) {
StockHistory sh = new StockHistory();
sh.setStockHistoryNo(j);
sh.setCount(j*2);
sh.setReceivingDate(new Date());
itemStocks.add(sh);
}
item.setStockHistory(itemStocks);
item.setJoinDate(format.format(new Date()));
return item;
}
private static List<Item> getItems() {
List<Item> list = new ArrayList<Item>();
for (int i=1; i<=3; i++) {
list.add(getItem(i));
}
return list;
}
}
3. 실행결과【Windows(이클립스) / Linux】
4. 전체코드
반응형
'프로그래밍 > Java-자주쓰는예제' 카테고리의 다른 글
【Java-데이터】 객체를 XML데이터로 변환하기 (0) | 2021.09.19 |
---|---|
【Java-데이터】Json데이터를 Java 객체로 변환하기 (0) | 2021.09.18 |
【Java-파일】파일과 디렉토리 삭제 (0) | 2021.09.13 |
【Java-파일】파일 정보보기 (0) | 2021.09.13 |
【Java-파일】파일과 디렉토리에 권한부여하기 (0) | 2021.09.13 |
댓글