2011-06-12 9 views
183

asp.net webservice에 JSON 개체를 게시하려고합니다.Jquery Ajax webservice에 json 게시

내 JSON은 다음과 같습니다

var markers = { "markers": [ 
    { "position": "128.3657142857143", "markerPosition": "7" }, 
    { "position": "235.1944023323615", "markerPosition": "19" }, 
    { "position": "42.5978231292517", "markerPosition": "-3" } 
]}; 

내가 내 JSON 개체를 stringyfy하는 json2.js를 사용하고 있습니다.

그리고 내 웹 서비스에 게시하려면 jquery를 사용하고 있습니다. 원시

"잘못된 JSON :

$.ajax({ 
     type: "POST", 
     url: "/webservices/PodcastService.asmx/CreateMarkers", 
     data: markers, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function(data){alert(data);}, 
     failure: function(errMsg) { 
      alert(errMsg); 
     } 
    }); 

나는 다음과 같은 오류를 얻고있다

나는이 관련된 게시물의 무리를 발견하고 그것을 내가하려고 정말 일반적인 문제 아무것도하지만 것 같다 이 문제를 해결

서버에 게시되는 내용 방화 광은 다음과 같습니다.

markers%5B0%5D%5Bposition%5D=128.3657142857143&markers%5B0%5D%5BmarkerPosition%5D=7&markers%5B1%5D%5Bposition%5D=235.1944023323615&markers%5B1%5D%5BmarkerPosition%5D=19&markers%5B2%5D%5Bposition%5D=42.5978231292517&markers%5B2%5D%5BmarkerPosition%5D=-3

호출되는 16,

내 웹 서비스 기능은 다음과 같습니다

[WebMethod] 
public string CreateMarkers(string markerArray) 
{ 
    return "received markers"; 
} 
+0

'실패'는 http://api.jquery.com/jQuery.ajax/에 나열된 것 중에서 가능한 설정으로 제공되지 않습니다 ... 대신 '오류'로 오인했을 수 있습니까? – danicotra

답변

314

json2.js를 사용하여 데이터의 문자열을 지정했지만 게시 된 데이터는 URL 인코딩 된 JSON 인 것으로 나타났습니다. 이미 본 적이 있지만 this post about the invalid JSON primitive은 JSON이 URL 인코딩 된 이유를 설명합니다.

저는 advise against passing a raw, manually-serialized JSON string into your method입니다. ASP.NET은 요청의 POST 데이터를 자동으로 JSON deserialize 할 것이므로, 수동으로 JSON 문자열을 직렬화하여 ASP.NET으로 보내면 실제로 JSON 직렬화 문자열을 직렬화해야합니다.

나는이 라인을 따라 뭔가 더 좋을 것 :

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" }, 
       { "position": "235.1944023323615", "markerPosition": "19" }, 
       { "position": "42.5978231292517", "markerPosition": "-3" }]; 

$.ajax({ 
    type: "POST", 
    url: "/webservices/PodcastService.asmx/CreateMarkers", 
    // The key needs to match your method's input parameter (case-sensitive). 
    data: JSON.stringify({ Markers: markers }), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data){alert(data);}, 
    failure: function(errMsg) { 
     alert(errMsg); 
    } 
}); 

잘못된 JSON 원시 문제를 피하는의 핵심은되도록 data 매개 변수가 아닌 자바 스크립트 객체 jQuery를에게 JSON 문자열을 전달하는 것입니다 jQuery를 귀하의 데이터를 URL 인코딩하려고 시도하지 않습니다.서버 측에

, 당신은에 전달하는 데이터의 형태로 메소드의 입력 매개 변수와 일치 : 당신이 원하는 경우

public class Marker 
{ 
    public decimal position { get; set; } 
    public int markerPosition { get; set; } 
} 

[WebMethod] 
public string CreateMarkers(List<Marker> Markers) 
{ 
    return "Received " + Markers.Count + " markers."; 
} 

는 또한, Marker[] Markers처럼 배열을 받아 들일 수 있습니다. ASMX ScriptServices가 사용하는 디시리얼라이저 (JavaScriptSerializer)는 매우 유연하며 입력 데이터를 지정한 서버 측 유형으로 변환 할 수있는 작업을 수행합니다.

+0

당신의 자세한 반응에 대해 너무 고마워요! –

+3

"jQuery가 데이터를 URL 인코딩하려고 시도하지 않습니다."하지만 옳지 않습니다. jQuery가 데이터를 urlencoding하지 못하도록하려면 당신은 processData를 false로 설정해야만한다. – Softlion

+8

문자열을 전달하는 것은 jQuery가 데이터 파라미터를 URLEncoding하는 것을 막기에 충분하다. sData를 false로 설정하지만 불필요합니다 (JSON 문자열을 데이터에 전달하지 않고 혼자서 작업하는 것만으로는 충분하지 않습니다). –

11
  1. markers는 JSON 객체가 아닙니다. 이것은 일반적인 JavaScript 객체입니다.
  2. Read about the data: option :

    Data to be sent to the server. It is converted to a query string, if not already a string.

당신이 JSON으로 데이터를 전송하려면 먼저 인코딩해야합니다 :

data: {markers: JSON.stringify(markers)} 

jQuery를 자동으로 JSON으로 객체 나 배열을 변환하지 않습니다.


그러나 오류 메시지는 서비스의 응답 해석에 있다고 가정합니다. 다시 보낸 텍스트는 JSON이 아닙니다. JSON 문자열은 큰 따옴표로 묶어야합니다. 따라서해야 할 일은 다음과 같습니다.

return "\"received markers\""; 

실제 문제가 데이터를 보내고 받고 있는지 확실하지 않습니다.

+0

Felix에게 도움을 주셔서 감사합니다. JSON.stringyfy 메서드를 통해 마커를 실행하여 쿼리 문자열로 변환 했으므로 제안했지만 불행히도 작동하지 않는다고 생각합니다. 다음을 게시하지 않습니다. –

+0

마커 = % 7B % 22 마커 % 22 % 3A % 5B % 7B % 22 위치 % 22 % 3A % 22128.3657142857143 % 22 % 2C % 22 마커 위치 % 22 % 3A % 227 % 22 % 7D % 2C % 7B % 22 위치 % 22 % 3A % 22235.1944023323615 % 22 % 2mark % 22marker % 22 % 3A % 2219 % 22 % 7D % 2C % 7B % 22 위치 % 22 % 3A % 2242.5978231292517 % 22 % 2C % 22marker 위치 % 22 % 3A % 22-3 % 22 % 7D % 5D % 7D –

+0

@Dreamguts : 당신이 원하는 것이 무엇인지 조금 불분명합니다. '마커 '를 JSON 문자열로 보내시겠습니까? –

2

나는 이것도 만났습니다. 이것이 제 해결책입니다.

당신이 당신의 JSON 문자열이 올 것을 알고에도 불구하고, 데이터를 분석 할 때 잘못된 JSON 개체 예외가 발생하는 경우 JSON으로 파싱하기 전에 아약스 코드에서 수신 된 데이터 캐릭터 라인 화 :

$.post(CONTEXT+"servlet/capture",{ 
     yesTransactionId : yesTransactionId, 
     productOfferId : productOfferId 
     }, 
     function(data){ 
      try{ 
       var trimData = $.trim(JSON.stringify(data)); 
       var obj  = $.parseJSON(trimData); 
       if(obj.success == 'true'){ 
        //some codes ... 
2

을 나는 Dave Ward의 해결책을 시도했다. 콘텐츠 유형"application/json"으로 설정되어 있으므로 게시 요청의 페이로드 부분에있는 브라우저에서 데이터 부분을 보내지 않았습니다. 이 줄을 제거하고 나면 모든 것이 훌륭하게 작동했습니다.

var markers = [{ "position": "128.3657142857143", "markerPosition": "7" }, 

       { "position": "235.1944023323615", "markerPosition": "19" }, 

       { "position": "42.5978231292517", "markerPosition": "-3" }]; 

$.ajax({ 

    type: "POST", 
    url: "/webservices/PodcastService.asmx/CreateMarkers", 
    // The key needs to match your method's input parameter (case-sensitive). 
    data: JSON.stringify({ Markers: markers }), 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function(data){alert(data);}, 
    failure: function(errMsg) { 
     alert(errMsg); 
    } 
}); 
-1

자바의 웹 서비스에 아약스 호출이를 따르십시오

$.ajax({ 
      dataType : 'json', 
      type  : 'POST', 
      contentType : 'application/json', 
      url   : '<%=request.getContextPath()%>/rest/priceGroups', 
      data  : JSON.stringify({data : param}), 
      success  : function(res) { 
       if(res.success == true){ 
        $('#alertMessage').html('Successfully price group created.').addClass('alert alert-success fade in'); 
        $('#alertMessage').removeClass('alert-danger alert-info'); 
        initPriceGroupsList(); 
        priceGroupId = 0; 
        resetForm();                  
       }else{       
        $('#alertMessage').html(res.message).addClass('alert alert-danger fade in'); 
       } 
       $('#alertMessage').alert();   
       window.setTimeout(function() { 
        $('#alertMessage').removeClass('in'); 
        document.getElementById('message').style.display = 'none'; 
       }, 5000); 
      } 
     }); 
+0

자바 웹 서비스의 ajax 호출에 json으로 오브젝트 전달을 나열하는 방법은 여기에 있습니다. –

0

나는 쿼리,

$("#login-button").click(function(e){ alert("hiii"); 

     var username = $("#username-field").val(); 
     var password = $("#username-field").val(); 

     alert(username); 
     alert("password" + password); 



     var markers = { "userName" : "admin","password" : "admin123"}; 
     $.ajax({ 
      type: "POST", 
      url: url, 
      // The key needs to match your method's input parameter (case-sensitive). 
      data: JSON.stringify(markers), 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function(data){alert("got the data"+data);}, 
      failure: function(errMsg) { 
       alert(errMsg); 
      } 
     }); 

    }); 

내가 JSON의 로그인 세부 정보를 게시하고 문자열을 얻고있다 "Success"으로 표시하고 있지만 응답이 없습니다.

+1

이것은 질문에 대한 대답이 아닙니다. 질문을하고 싶다면 "질문"메뉴로 이동하여 "질문하기"를 클릭하십시오. 질문이이 질문과 관련이 있다면 질문에 참조 링크를 제공하십시오. – Mittal

+1

새로운 질문이있는 경우 [Ask Question] (https://stackoverflow.com/questions/ask) 버튼을 클릭하여 질문하십시오. 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. - [From Review] (리뷰/저품절 게시물/18595928) – VKen