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

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

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

1. 설명 

이 포스트에서 다룰 예제는 "Json형식의 데이터를 데이터가 담기는 클래스의 객체로 변환"(역직렬화: Deserialization)해주는 코드입니다.

제가 경험한 업무에서 데이터 객체를 Json으로 변환하는 데 필요한 경우는
아래와 같은 흐름의 프로그램을 만들어할 때 였습니다.  

1) API에 HTTP 요청 -> 2) Response body의 JSON데이터를 읽어오기 -> 3) 데이터 클래스의 객체에 데이터 매핑 -> 4) DB 또는 파일로 데이터 저장

예제코드 구현은 지난 포스트와 같이 동일하게 jackson-databind를 사용해서 구현했습니다


2. 소스코드

- 메서드 

     	// (1)
        public JsonNode getJsonNode(File json) {
		if (json == null) return null;
		
		JsonNode res = null;
		
		try {
		    res = mapper.readTree(json);
		} catch (JsonProcessingException e) { e.printStackTrace(); 
		} catch (IOException e) { e.printStackTrace(); }
		
		return res;
	}
     
     // (2) 
     public Object jsonToObj(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;
	}
	
    // (3)
	public Object jsonListToObjList(String json, JsonToObj jsonToObj) {
		if (json == null) return null;
		
		Object res = null;
		
		try {
			res = mapper.readValue(json, jsonToObj.getTypeReference());

		} catch (JsonProcessingException e) { e.printStackTrace(); }
		
		return res;
	}

- (1) JSON데이터에서 필요한 데이터만을 가져올 때 사용합니다.

 

- (2) JSON데이터를 Java Object로 변환합니다. 

예제에서 사용하고 있는 Item클래스와 같은 클래스를 데이터를 매핑할 틀로 주로 사용하며, 

List와 같은 컬렉션도 틀로서 사용할 수 있습니다. 

List를 틀로 사용할 경우 List<Map>의 형태로 데이터를 반환합니다.

 

- (3) JSON 리스트 데이터를 List<Object>로 변환합니다. 

기능 확장을 유연하게 늘릴 수 있도록 

JsonToObj라는 인터페이스를 만들고, 인터페이스를 구현한 클래스를 변수로 받아서 원하는 형식으로 데이터를 변환 할 수 있도록 했습니다.

 

※ 인터페이스와 구현 클래스 

public interface JsonToObj {
	public TypeReference<?> getTypeReference();
}

public class JsonToObjUserList implements JsonToObj {

	@Override
	public TypeReference<?> getTypeReference() {
		return new TypeReference<List<Item>>(){};
	}

}

 

- 메인 

public class Data_02_JsonParsing {

	public static void main(String[] args) {
		try {
			for (String str : args ) {
				System.out.println("Param : "+str);
			}
			
			JsonUtil ju = JsonUtil.getInstance();

			/**
			 * JSON 객체 1개 -> JsonNode
			 */
			System.out.println("---------- JSON -> JsonNode ----------");
			JsonNode jsonNode = ju.getJsonNode(new File(args[0]));
			System.out.println(jsonNode.toPrettyString());
			System.out.println(jsonNode.get("itemId").asInt());
			System.out.println(jsonNode.get("itemName").asText());
			System.out.println(jsonNode.get("itemPrice").asLong());
			System.out.println(jsonNode.get("sales").asBoolean());
			System.out.println(jsonNode.get("images").isArray());
			System.out.println(jsonNode.get("images").get(2).asText());
			System.out.println(jsonNode.get("stockHistory").get(0).get("receivingDate").asText());
			System.out.println("");
			
			
			/**
			 * JSON 객체 1개 -> Object지정
			 */
			System.out.println("---------- JSON -> Object One ----------");
			Item item = (Item)ju.jsonToObj(new File(args[0]), Item.class);
			System.out.println(item.toString());
			System.out.println("");
			
			
			/**
			 * JSON 리스트 -> List<Map> Object 지정이 없다면 Map에 데이터가 담긴다.
			 */
			System.out.println("---------- JSON List -> List<Map> ----------");
			
			List list = (List)ju.jsonToObj(new File(args[1]), List.class);
			for (Object data : list) {
				System.out.println(data instanceof Map);
				System.out.println(data instanceof Item);
				
				Map map = (Map)data;
			    for (Object keyObj : map.keySet()) {
			    	String key = (String)keyObj;
			    	System.out.println("Key : "+key+", Value : "+map.get(key));
			    }
				
			}
			System.out.println("");
			
			/**
			 * JSON 리스트 -> List<Object지정>
			 */
			System.out.println("---------- JSON List -> List<Object> ----------");
			
			Object obj = ju.jsonListToObjList(new File(args[1]), new JsonToObjUserList());
			List<Item> items = (List<Item>) obj;
			for	(Item itemData : items) {
				System.out.println(itemData.toString());
			}
			
			System.exit(0);
			
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
	}
}


3. 실행결과【Windows(이클립스) / Linux】


4. 전체코드

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

반응형

댓글