반응형
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. 전체코드
반응형
'프로그래밍 > Java-자주쓰는예제' 카테고리의 다른 글
【Java-데이터】 XML데이터를 Java객체로 변환하기 (0) | 2021.09.19 |
---|---|
【Java-데이터】 객체를 XML데이터로 변환하기 (0) | 2021.09.19 |
【Java-데이터】객체를 Json형식의 데이터로 변환하기 (0) | 2021.09.17 |
【Java-파일】파일과 디렉토리 삭제 (0) | 2021.09.13 |
【Java-파일】파일 정보보기 (0) | 2021.09.13 |
댓글