위드
1k
2018-11-27 10:31:43
6
2637

[JAVA] ajax로 넘겨준 json 데이터 중 map 배열로 이뤄진 배열 데이터 값 파싱이 안되는데 어떻게해야 될까요?


안녕하세요

아래와 같이 했을때,


ajax로 넘겨준 json 데이터 중 map 배열로 이뤄진 배열 데이터인 "test" 값 파싱이 안되는데 어떻게해야 될까요?

VO객체가아니라 @RequestParam Map 을 사용합니다.


$.ajax({
	type : "POST"
	,url : "/test"
	,dataType : "json"
	,data: {
		"a": 123
		, "b": "asdf"
		, "c": "Y"
		, "d": "Y"
		, "test": new Array({"num":1, "use":"Y"},{"num":2, "use":"N"},{"num":3, "use":"Y"})
	}
}).done(function(data){
	
}).fail(function(){
	
});


@ResponseBody
@RequestMapping(value="/test", method={RequestMethod.GET, RequestMethod.POST})
public String test(@RequestParam Map<String, Object> param, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {
	System.out.println(param);
	
	JSONObject jsonObject = new JSONObject(param);
	JSONArray jsonArray = (JSONArray)jsonObject.get("subChnlUseYnList");
	
	System.out.println(jsonObject);
	System.out.println(jsonObject.get("productCode"));
	System.out.println(jsonObject.get("subChnlUseYnList"));
	System.out.println(jsonArray.size());
	
	return "";
}


System.out.print(jsonObject) 결과

{a=123, b=asdf, c=Y, d=Y, test[0][num]=1, test[0][use]=Y, test[1][num]=2, test[1][use]=N, test[2][num]=3, test[2][use]=Y}


System.out.print(jsonObject.get("b") 는 출력이 잘 되는데

System.out.print(jsonObject.get("test") 를 하면 null이 됩니다.


ajax 데이터를 stringify()하거나

JSONParser를 사용하기도했는데 잘 안되네요..


답변 부탁드립니다.

0
0
  • 답변 6

  • 20170923
    1k
    2018-11-27 11:02:17

    헉.. 아직도 해결 안되셨군요

    test[0]이랑 test[0][num] 찍어보시면 어떤 결과가 나오나요?

    1
  • 20170923
    1k
    2018-11-27 11:05:39

    test[0]은 null point 발생하고 test[0][num]은 1이 출력될거같은데 

    만약 그렇다면 

    JSONObject jsonObject = new JSONObject(param);

    {a=123, b=asdf, c=Y, d=Y, test[0][num]=1, test[0][use]=Y, test[1][num]=2, test[1][use]=N, test[2][num]=3, test[2][use]=Y}

    위의 param값 그대로 key value가 잡힌거같아요

    1
  • 위드
    1k
    2018-11-27 12:47:10

    혹시 이경우 원하는대로 파싱해서 사용하려면 어떻게 해야 될까요?

    0
  • 포기해..
    769
    2018-11-27 12:53:07


    import org.json.simple.JSONArray;
    import org.json.simple.JSONObject;
    import org.json.simple.parser.JSONParser;
    
            @ResponseBody
    	@RequestMapping(value = "/test", method = RequestMethod.POST)
    	public String practice1(@RequestParam Map<String, Object> param, HttpServletRequest request, HttpServletResponse response, ModelMap model) throws Exception {
    		System.out.println(param);
    		
    		String jsonStr = (String) param.get("data");
    		
    		JSONParser parser = new JSONParser();
    		JSONObject jsonObject = (JSONObject) parser.parse(jsonStr);
    		
    		JSONArray jsonArray = (JSONArray)jsonObject.get("test");
    		System.out.println(jsonObject);
    		System.out.println(jsonObject.get("a"));
    		System.out.println(jsonObject.get("test"));
    		System.out.println(jsonArray.size());
    		
    		return "";
    	}


    var data = {
    			"a": 123
    			, "b": "asdf"
    			, "c": "Y"
    			, "d": "Y"
    			, "test": new Array({"num":1, "use":"Y"},{"num":2, "use":"N"},{"num":3, "use":"Y"})
    		};
    	
    	$.ajax({
    		type : "POST"
    		,url : "/test"
    		,dataType : "json"
    		,data:{data:JSON.stringify(data)}
    		,traditional : true
    	}).done(function(data){
    		
    	}).fail(function(){
    		
    	});


    1
  • 포기해..
    769
    2018-11-27 12:53:51
    1
  • 위드
    1k
    2018-11-27 13:52:03

    두분 모두 답변 감사합니다.

    찾아보니 ajax 의 json내에 배열값으로 전송시 'traditional' 옵션을 통해 직렬화를 해야

    test[0][num]... 과 같이 key값이 전송되지 않고

    test 키에 담겨서 간다고하네요!


    덕분에 한가지 배웠습니다~


    파싱은 JSONParser를 사용하지 않고 그냥

    JSONObject jsonObject = new JSONObject(param);

    JSONArray jsonArray = new JSONArray(jsonObject.get("test").toString());

    이런식으로 처리했습니다(문제되진 않겠죠?)

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.