Object 배열 ajax 로 Java 에 넘기기 (String 을 JSONArray 로, JSONArray 를 List Map 으로)
jsp 나 xml 같은 화면단에서 같은 형식의 여러 데이터를 object 배열에 담아
java 로 보낸 후 java에서 list map 형식으로 바꿔 사용할때!
데이터를 담아 보낸 뒤 java 에서 푸는 과정에 오류가 생겨 고생햇다...😔
[2017-11-24 09:08:32,050] [http-bio-8080-exec-5] [ERROR] [NCFMappingExceptionResolver:17] : NCFMappingExceptionResolver A JSONObject text must begin with '{' at character 1 of [{"workDay":"20171102","seqNo":"1","channelType":"EM","memberId":"lee2gogo","memberIdSeq":"31113154","resendToken":"ymk@naver.com"}
at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:512)
at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1096)
at net.sf.json.JSONObject._fromString(JSONObject.java:1317)
at net.sf.json.JSONObject.fromObject(JSONObject.java:185)
at net.sf.json.JSONObject.fromObject(JSONObject.java:154)
at partner.controller.CallCenterController.customResendSchdl(CallCenterController.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
JSONObject 값은 무조건 { 로 시작해야하는데 [ 로 시작해서 에러....
***참고
- [{}] : 배열 형태의 데이터
- {} : 1개의 데이터 값
그러므로 파싱을 하거나 생성을 할때 데이터 타입과 맞게 사용해야 한다.
- org.json.JSONArray (배열 파싱)
- org.json.JSONObject (1개의 데이터 값)
object 여러개를 배열로 묶었으니 JSONArray 로 받아서 파싱해야 한다!
묶은 순서에 맞게 풀기 ~~!
간단히,, 한눈에 들어오는게 좋으니~~ 순서는 아래와 같다.
JSONArray array = JSONArray.fromObject(jtext);
JSONObject obj = (JSONObject)array.get(0);
String str = String.valueOf(obj.get("item"));
***script
테이블의 여러 행 중 체크박스로 선택 된 값들을 배열 안에 오브젝트 형식으로 담는다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | function resend(){ var param = []; //resendChk 클래스를 상속받은 체크박스 중 checked 인 것들만 가져와 for문과 같은 역할의 each 함수 사용 $(".resendChk:checked").each(function(i) { var data = { memberId : $(this).parents('tr').find("td.paramMemberId").text(), memberIdSeq : $(this).parents('tr').find("td.paramMemberIdSeq").text(), resendToken : $(this).parents('tr').find("td input").val(), serverId : $(this).parents('tr').find("td.paramServerId").text() }; //param 배열에 data 오브젝트를 담는다. param.push(data); }); | cs |
http://mingggu.tistory.com/66 에서 사용했던것과 같이 param 데이터를 직렬화 시킨다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var jsonData = JSON.stringify(param); jQuery.ajaxSettings.traditional = true; $.ajax({ url : '<c:url value="/partner/callCenterPopup/resend"/>', type: 'POST', headers: { "mode" : CommonConstant.RequestMode.regist }, data: {"jsonData" : jsonData}, dataType:'json', success: function(data) { alert('리스트에 추가하였습니다.'); $(".resendChk").prop('checked', false); }, error: function(x, e) { //err msg 출력 $.failMsg('error'); } }); } | cs |
***java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | @RequestMapping(value="/partner/callCenterPopup/resend", headers=RequestModeConstant.HEADER_REGIST) public @ResponseBody Object callCenterResend(@RequestParam String jsonData) { Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> paramMap = new HashMap<String, Object>(); //직렬화 시켜 가져온 오브젝트 배열을 JSONArray 형식으로 바꿔준다. JSONArray array = JSONArray.fromObject(jsonData); List<Map<String, Object>> resendList = new ArrayList<Map<String, Object>>(); for(int i=0; i<array.size(); i++){ //JSONArray 형태의 값을 가져와 JSONObject 로 풀어준다. JSONObject obj = (JSONObject)array.get(i); Map<String, Object> resendMap = new HashMap<String, Object>(); resendMap.put("memberId", obj.get("memberId")); resendMap.put("memberIdSeq", obj.get("memberIdSeq")); resendMap.put("resendToken", obj.get("resendToken")); resendMap.put("serverId", obj.get("serverId")); resendList.add(resendMap); } paramMap.put("resendList", resendList); int cnt = callCenterService.callCenterResend(paramMap); result.put("result", "success"); result.put("cnt", cnt); return result; } | cs |