2010-03-29 5 views
20

JQuery를 사용하여 JSON 요청을 서버로 다시 보내고 있으며 매개 변수 직렬화가 자연에서 일반적인 것 대신 PHP가 예상하는 것으로 하드 코딩 된 것 같습니다. 기본적으로 나는이처럼 보이는 물체가 :브래킷을 사용하지 않고 JQuery 매개 변수 직렬화

{ 
    foo: 1, 
    bar : [1, 3, 5] 
} 

을 그리고 그것을 직렬화 :

foo=1&bar[]=1&bar[]=3&bar[]=5 

은 그냥 할 수 있도록 어쨌든이 있나요?

foo=1&bar=1&bar=3&bar=5 

jQuery는 서버 측 프레임 워크의 일부가 명명 규칙으로 기대하는 것과 관련되어서는 안됩니다. 내 매개 변수를 bar[]이라고 부르기를 원한다면 내 서버 측 코드에서 기대하는대로 쉽게 이름을 지정할 수 있습니다.

답변

26

JQuery 1.4를 사용하고 있다고 가정합니다. 당신은 이것을보아야합니다 : http://benalman.com/news/2009/12/jquery-14-param-demystified/

저자는 JQuery가 이런 식으로 행동하게 만든 이유와 몇 가지 중요한 점을 설명합니다. 예를 들어 "대괄호 구문"을 사용하지 않으면 단일 값으로 배열을 전달할 수 없습니다.

그는 또한 해결 방법 제공 :

$.ajaxSetup({ traditional: true }); 

이 직렬화의 비 브래킷 방법을 사용하는 JQuery와 말할 것이다.

+4

서버 측 프레임 워크에 대괄호가 필요한 경우 param 이름을 일치하도록 변경해야하며 서버 독립적 인 프런트 엔드 라이브러리의 기본값이 아니어야합니다. – mpeters

+0

당신이 주장하는 방법이 어떤면에서 "올바른"것이라면 당신의 주장은 더욱 설득력이있을 것이라고 생각합니다. 분명히 배열 구문을 처리하는 방법을 다루는 RFC 나 표준은 없으며 새로운 기술이 더 유연한 옵션을 선택하는 것처럼 보입니다.당신은 JQuery가 "명명 규칙"에 묶여서는 안되지만 분명히 두 방법 모두를 지원한다고 말하면, 괄호없는 구문은 묶는 것을 말하는 것과 마찬가지로 쉽게 주장 할 수 있습니다. – zombat

+0

jQuery API에는 다음과 같은 내용이 있습니다. jQuery는 동일한 키, 즉 {foo : [ "bar1", "bar2"]}가 '& foo = bar1 & foo = bar2'가되는 여러 값을 직렬화합니다. 제공된 예제에서 대괄호가 표시되지 않는 것을 확인하십시오 ... –

11

$.param(obj,true)을 사용하여 개체를 매개 변수화 된 문자열로 변환 할 수 있습니다. 두 번째 부울 매개 변수는 객체를 serialize하는 전통적인 방법을 사용해야 함을 나타냅니다. 전통적인 방법은 동일한 매개 변수 이름을 만났을 때 대괄호를 사용하지 않습니다. $.param에서 반환 된 직렬화 된 문자열은 모든 ajax 메서드를 통해 전달할 수 있습니다.

참고 :

이 방법은 내용의 jQuery Documentation에서 언급 한 바와 같이 $.ajaxSetup()를 사용하여 선호되고 여기에 지정된 설정은 $ 아약스 또는 AJAX 기반의 파생 상품에 대한 모든 호출에 영향을 미칠 것 같은 $ 갔지 등(). 이로 인해 다른 호출자 (예 : 플러그인)가 의 기본 기본 설정을 기대할 수 있으므로 바람직하지 않은 동작이 발생할 수 있습니다. 따라서이 API 사용에 대해서는 을 강력히 권장합니다. 대신, 호출에서 옵션을 명시 적으로 설정하거나 간단한 플러그인을 정의하여 호출하십시오.

예 :

var obj = {myProp: "test", arr: [1,2,3,4]}; 
var serializedObj = $.param(obj, true); //myprop=test&arr=1&arr=2&arr=3&arr=4 

$.post(url,serializedObj,function(){}); 
서버 측 언어/프레임 워크는 문제의 쿼리 문자열에서 단일 요소 배열을 지원하지 않는 경우 글쎄, 잘 :) 내 원래의 지점으로 다시 저를 가져온다
관련 문제