OpenSource/Spring Boot
json to dto or json to values
태하팍
2024. 5. 13. 16:10
반응형
json데이터를 dto에 매핑하는 방법에 대해서 알아보겠습니다.
1. ObjectMapper를 이용해서 매핑하기
- mapper.readValue(json, new TypeReference<List<ProductInfoDTO>>(){});
public Map<String, String> getJson() throws IOException {
Map productInfoMap = new HashMap();
ApplicationContext context = new AnnotationConfigApplicationContext();
// "data" 폴더 아래 모든 JSON 파일 가져오기
Resource[] resources = context.getResources("classpath:data/*.json");
for (Resource resource : resources) {
InputStream inputStream = resource.getInputStream();
byte[] bytes = StreamUtils.copyToByteArray(inputStream);
String json = new String(bytes);
ObjectMapper mapper = new ObjectMapper();
List<ProductInfoDTO> jsonData = mapper.readValue(json, new TypeReference<List<ProductInfoDTO>>() {
});
for (ProductInfoDTO productInfoDTO : jsonData) {
System.out.println("-------------->" + productInfoDTO.getName());
System.out.println("-------------->" + productInfoDTO.getCompany() + "," + productInfoDTO.getTitle());
productInfoMap.put(productInfoDTO.getName(), productInfoDTO.getCompany() + "," + productInfoDTO.getTitle());
}
}
return productInfoMap;
}
예로 json file의 내용은 아래와 같습니다.
[{
"id": 1,
"name": "제주농장 직송 당근 품목: 유기농 제주 흙당근 / 무게: 유기농 흙당근 (크기혼합) 3kg",
"company": "몰랑",
"title": "유기농 흙당근 (크기혼합) 3kg"
}, {
"id": 2,
"name": "제주농장 직송 당근 품목: 유기농 제주 흙당근 / 무게: 유기농 흙당근(크기 혼합) 5kg",
"company": "몰랑",
"title": "유기농 흙당근(크기 혼합) 5kg"
}]
매핑할 dto는 아래와 같습니다.
import lombok.Data;
@Data
public class ProductInfoDTO {
private int id;
private String name;
private String company;
private String title;
}
2. 조금 더 복잡한 json은 어떻게 처리 해야할까요?
예를 들어 api를 찔러서 나온 json이 있을 때 접근을 어떻게해서 가져올까요?
바로 at 메소드를 사용해서 접근하고 데이터를 가져오자!
JsonNode node = ...; // JSON 노드 객체
// 키 이름을 사용하여 값 추출
JsonNode valueAtKey = node.at("/path/to/key");
// 인덱스를 사용하여 값 추출
JsonNode valueAtIndex = node.at(0);
// JSONPath 표현식을 사용하여 값 추출
JsonNode valueAtPath = node.at("$.path.to.value");
예를 들면 아래와 같은 json이 있다고 하면
{
"originProduct": {
"detailAttribute": {
"optionInfo": {
"optionCombinationSortType": "CREATE",
"optionCombinationGroupNames": {
"optionGroupName1": "친환경 제주 블루베리 예약 판매"
},
"optionCombinations": [{
"id": 1,
"optionName1": "무농약 블루베리 (특대과-왕특) 500g",
"stockQuantity": 998,
"price": 0,
"usable": true
}, {
"id": 2,
"optionName1": "무농약 블루베리 (특대과-왕특) 1kg",
"stockQuantity": 1000,
"price": 17100,
"usable": true
}]
}
}
}
}
아래의 소스처럼 접근을 할수가 있습니다.
JsonNode optionTitle = productsNode.at("/originProduct/detailAttribute/optionInfo/optionCombinationGroupNames/optionGroupName1");
JsonNode optionContents = productsNode.at("/originProduct/detailAttribute/optionInfo/optionCombinations");
for(JsonNode optionContent:optionContents){
system.out.println(optionTitle+":"+optionContent.at("/optionName1"));
}
결과는 아래와 같습니다.
이처럼 json형태의 포맷에서 dto 또는 vaule를 구해올수 있습니다.
위에서 value를 구해서 dto에 setter를 해주면 dto에 저장시킬수도 있습니다.
또는 json포맷으로 다시 재정의해서 리턴을 할 수도 있습니다.
반응형