spring memo

spring ajax에서 보낸 list json을 java에서 받기

고랑이. 2018. 7. 17. 17:15

리스트를 전달하기 위해 검색을 많이 해봣지만

대부분 리스트타입을 리스트 타입으로 넘기거나, json을 json으로 넘기는 경우가 많았다.


내 경우 리스트와 함게 string타입의 다른 파라미터도 같이 넘겨 db를 타는 경우가 많기 때문에

파라미터타입을 map으로 주로 사용을 한다.


아래의 경우 파라미터 타입을 HashMap으로 사용하는 경우이다.



[script]

리스트를 json타입으로 변환해준 후 ajax를 통해 controller로 전달

var dataParam = {list:JSON.stringify($scope.lists), param1:'param1', param2:'param2'};

$.ajax({

type : 'POST',  

dataType : 'json', 

data: dataParam,

url : url,  

success : function(returnData) {

    

},error:function(e){


};

}

}); 

key : list,        value = json list

key : param1 , value ="param1"

key : param2,  value ="param2"


와 같은 map타입의 파라미터 이다.



[java]

//import com.fasterxml.jackson.databind.ObjectMapper;


public Map<String, Object> jsonList(@RequestParam Map<String, Object> parameters){

String json = parameters.get("list").toString();

ObjectMapper mapper = new ObjectMapper();

List<Map<String, Object>> list = mapper.readValue(json, new TypeReference<ArrayList<Map<String, Object>>>(){});


return null;

}


HashMap타입의 parameter에서 key가 list인 값을 string형태로 가져온다.

여기서 String 형태의 json값을 arrayList로 풀어가는 과정이다.


결과적으로 List<> list 에는 json을 arrayList로 변환한 값이 들어가 있다.


이 리스트를 DTO로 받고싶은 경우

    List<DTO> list = mapper.readValue(json, new TypeReference<ArrayList<DTO>>(){});


로 바꾸어 사용하면 된다.





-------- 2018-09-12  내용추가 ----------------------------------------

위와 같은 내용을 알려주던 중 질문 하나를 받았다.

Map의 Object타입을 이용하는 경우 xml에서 int와 string을 구분할 수 있을까?

xml에서 타입 지정이 가능하다.

직접 해본 바로는

int타입은 #{key, jdbcType=INTEGER} 로 지정해주면 해당 값이 int형으로 넘어간다.

String타입은 같은 방법으로 지정해도 되지만 따로 지정하지 않아도 제대로 값이 들어갔다.