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포맷으로 다시 재정의해서 리턴을 할 수도 있습니다.

 

반응형