jquery Ajax 웹 서비스에 JSON 게시


238

JSON 객체를 asp.net 웹 서비스에 게시하려고합니다.

내 json은 다음과 같습니다.

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

json2.js를 사용하여 json 객체를 stringyfy합니다.

jquery를 사용하여 웹 서비스에 게시하고 있습니다.

  $.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);
        }
  });

다음과 같은 오류가 발생합니다.

"잘못된 JSON 기본 요소 :

나는 이것과 관련된 게시물을 많이 발견했으며 실제로 일반적인 문제 인 것처럼 보이지만 문제를 해결하려고 시도하는 것은 없습니다.

Firebug가 서버에 게시되는 내용은 다음과 같습니다.

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 & 2 5D = 42.5978231292517 & markers % 5B2 % 5D % 5BmarkerPosition % 5D = -3

호출되는 웹 서비스 기능은 다음과 같습니다.

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

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

답변:


390

json2.js를 사용하여 데이터를 문자열 화하는 것에 대해 언급했지만 POST 된 데이터는 URL 인코딩 된 JSON 인 것으로 보입니다. 이미 본 것처럼 잘못된 JSON 기본 요소에 대한이 게시물 에서는 JSON이 URLEncode 된 이유를 다룹니다.

나는 거라고 조언 당신의 방법으로 원시, 수동으로 직렬화 된 JSON 문자열을 전달 . ASP.NET은 자동으로 JSON이 요청의 POST 데이터를 역 직렬화하므로 JSON 문자열을 수동으로 직렬화하여 ASP.NET으로 전송하는 경우 실제로 JSON 직렬화 문자열을 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가 데이터를 URL 인코딩하지 않도록 jQuery가 JavaScript 객체가 아닌 매개 변수 의 JSON 문자열을 jQuery에 전달하는 것 입니다.

서버 측에서 메소드의 입력 매개 변수를 전달중인 데이터의 모양과 일치 시키십시오.

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)는 매우 유연하며 입력 데이터를 지정한 서버 측 유형으로 변환 할 수있는 기능을 수행합니다.


4
"jQuery가 데이터를 URL 인코딩하려고 시도하지 않도록"작성했지만 올바르지 않습니다. jquery가 데이터를 urlencoding하는 것을 중지하려면 processData를 false로 설정해야합니다.
Softlion

8
jQuery가 데이터 매개 변수를 URLEncoding하지 못하도록 문자열을 전달하면 충분합니다. processData를 false로 설정할 수 있지만 불필요합니다 (데이터에 대한 JSON 문자열을 전달하지 않고 단독으로 수행하는 것만으로는 충분하지 않습니다).
Dave Ward

1
이 동일한 문제 (및 답변)도 Rails에 적용됩니다.
GregT

2
contentTypePOST가 아닌 GET을 사용하면 @DaveWard 가 고려 됩니까 ?
Royi Namir

@RoyiNamir ASMX ScriptServices 또는 ASPX WebMethods를 사용하는 경우 POST를 사용해야 JSON을 반환 할 수 있습니다. 컨텐츠 유형이 올바른지 여부를 GET하면 대신 XML이 표시됩니다.
Dave Ward

19
  1. markersJSON 객체가 아닙니다. 일반적인 JavaScript 객체입니다.
  2. data:옵션 에 대해 읽으십시오 :

    서버로 전송 될 데이터. 아직 문자열이 아닌 경우 쿼리 문자열 로 변환됩니다 .

데이터를 JSON으로 보내려면 먼저 인코딩해야합니다.

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

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


그러나 나는 오류 메시지가 서비스의 응답을 해석하는 데 있다고 가정합니다. 다시 보내는 텍스트가 JSON이 아닙니다. JSON 문자열은 큰 따옴표로 묶어야합니다. 따라서 다음을 수행해야합니다.

return "\"received markers\"";

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


Felix를 도와 주셔서 감사합니다. JSON.stringyfy 메소드를 통해 마커를 실행하여 쿼리 문자열로 변환하고 있다고 제안했지만 제안한대로 수행했지만 불행하게도 다음을 게시하지 않습니다.
코드 파라오

마커 = % 7B % 22markers % 22 % 3A % 5B % 7B % 22position % 22 % 3A % 22128.3657142857143 % 22 % 2C % 22markerPosition % 22 % 3A % 227 % 22 % 7D % 2C % 7B % 22position % 22 % 3A % 22235.1944023323615 % 22 % 2C % 22markerPosition % 22 % 3A % 2219 % 22 % 7D % 2C % 7B % 22position % 22 % 3A % 2242.5978231292517 % 22 % 2C % 22markerPosition % 22 % 3A % 22-3 % 22 % 7D % 5D % 7D
코드 파라오

@ Dreammguts : 그것은 당신이 원하는 것을 조금 불분명합니다. markersJSON 문자열 로 보내 시겠습니까?
Felix Kling

안녕하세요 Felix, 예. 마커 객체를 JSON 문자열로 보내서 웹 서비스에서 사용할 수 있도록하고 싶습니다.
코드 파라오

@ Dreamguts : 그런 다음이 방법으로 작동합니다. 또한 댓글에 게시 한 "코드"는 괜찮습니다. 물론 서버 측에서 올바르게 디코딩해야하며 매개 변수의 이름을 변경해야 할 수도 있습니다.
Felix Kling

3

Dave Ward의 솔루션을 사용해 보았습니다. contentType 이 (으)로 설정되어 게시 요청의 페이로드 부분에서 브라우저에서 데이터 부분이 전송되지 않았습니다 "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);
    }
});

2

나는 이것도 만났고 이것이 나의 해결책이다.

데이터를 구문 분석 할 때 유효하지 않은 json 오브젝트 예외가 발생하는 경우, json 문자열이 올바른지 알고 있지만 JSON으로 구문 분석하기 전에 Ajax 코드에서 수신 한 데이터를 문자열 화하십시오.

$.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 ...

1

질문이 있습니다.

$("#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 Patel

-2

java의 웹 서비스에 대한 ajax 호출로이를 수행하십시오. var param = {feildName : feildValue}; JSON.stringify ({data : param})

$.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);
            }
        });

여기에 자바 웹 서비스의 아약스 호출에 json으로 객체 전달을 나열하는 방법이 있습니다.
Ravi Panchal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.