programing

Jquery Ajax 웹 서비스에 JSON 게시

magicmemo 2023. 3. 12. 10:40
반응형

Jquery Ajax 웹 서비스에 JSON 게시

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

내 아들은 이렇게 생겼어

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

json2.js를 사용하여 JSON 오브젝트를 스트링하고 있습니다.

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하면 다음과 같습니다.

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

호출되는 웹 서비스 함수는 다음과 같습니다.

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

JSON2.js를 사용하여 데이터를 문자열화한다고 말씀하셨는데, POSTed 데이터는 URLEncoded JSON인 것 같습니다.이미 확인하셨을 수도 있지만 무효 JSON 프리미티브에 관한 투고에서는 JSON이 URLEncoded인 이유에 대해 다룹니다.

수동으로 직렬화된 원시 JSON 문자열을 메서드에 전달하지 않는 것이 좋습니다.ASP.NET은 요청의 POST 데이터를 자동으로 역직렬화합니다.따라서 수동으로 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);},
    error: function(errMsg) {
        alert(errMsg);
    }
});

유효하지 않은 JSON 프리미티브 문제를 회피하려면 jQuery를 JSON 문자열로 전달해야 합니다.datajQuery가 데이터를 URLEncode하지 않도록 JavaScript 개체가 아닌 매개 변수를 지정합니다.

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

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 ScriptSerializer가 사용하는(JavaScriptSerializer) 디시리얼라이저는 매우 유연하며 입력 데이터를 지정한 서버측 타입으로 변환하기 위해 할 수 있는 모든 작업을 수행합니다.

  1. markers는 JSON 객체가 아닙니다.일반 JavaScript 개체입니다.
  2. 옵션에 대해 확인:

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

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

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

jQuery는 객체 또는 어레이를 자동으로 JSON으로 변환하지 않습니다.


다만, 에러 메세지는 서비스의 응답을 해석하는 것으로 생각됩니다.반송하는 텍스트는 JSON이 아닙니다.JSON 문자열은 큰따옴표로 묶어야 합니다.따라서 다음과 같이 해야 합니다.

return "\"received markers\"";

당신의 실제 문제가 데이터 송수신인지 잘 모르겠습니다.

데이브 워드의 해결책을 시도해봤어요투고 요청의 페이로드 부분에 있는 브라우저에서 콘텐츠로 데이터 부분이 전송되지 않았습니다.유형이 다음과 같이 설정됩니다."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);
    }
});

저도 이런 경험을 했고 이것이 저의 해결책입니다.

데이터를 해석할 때 유효하지 않은 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 ...

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

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

언급URL : https://stackoverflow.com/questions/6323338/jquery-ajax-posting-json-to-webservice

반응형