JavaScript, jQuery, Java

Object 배열 ajax 로 Java 에 넘기기 (String 을 JSONArray 로, JSONArray 를 List Map 으로)

보리하늘 2018. 12. 17. 17:45
반응형

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


728x90
반응형