본문 바로가기
프로그래밍/Java-자주쓰는예제

【Java-데이터】객체를 Json형식의 데이터로 변환하기

by 코이킹 2021. 9. 17.
반응형

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】

이클립스에서 실행결과
Object 1개 -> JSON
List<Object> -> JSON List


4. 전체코드

https://github.com/leeyoungseung/template-java

반응형

댓글