Jquery Ajax การโพสต์ json ไปที่ webservice


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 เพื่อ stringyfy วัตถุ 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 และเครื่องหมาย% 5B0% 5D% 5BmarkerPosition% 5D = 7 และเครื่องหมาย% 5B1% 5D% 5Bposition% 5D = 235.1944023323615 และเครื่องหมาย% 5B1% 5D% 5BmarkerPosition% 5D = 19 และเครื่องหมาย% 5B2% 5D% 5Bposition% 5D = 42.5978231292517 และเครื่องหมาย% 5B2% 5D% 5BmarkerPosition% 5D = -3

ฟังก์ชั่นเว็บเซอร์ของฉันที่ถูกเรียกคือ:

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

'ความล้มเหลว' ไม่ได้จัดไว้ให้เป็นการตั้งค่าที่เป็นไปได้ในบรรดาที่ระบุไว้ในapi.jquery.com/jQuery.ajax ... บางทีคุณเข้าใจผิดว่ามี "ข้อผิดพลาด" แทน?
danicotra

คำตอบ:


390

คุณพูดถึงการใช้ json2.js เพื่อทำให้ข้อมูลของคุณเป็นข้อมูลสตริง แต่ข้อมูล POSTed ดูเหมือนจะเป็น URLEncoded JSON คุณอาจเคยเห็นมาแล้ว แต่โพสต์นี้เกี่ยวกับ JSON ดั้งเดิมที่ไม่ถูกต้องครอบคลุมถึงสาเหตุที่ JSON กำลัง URLEncoded

ผมจะให้คำแนะนำกับผ่านดิบด้วยตนเองต่อเนื่องสตริง JSON เข้าไปในวิธีการของคุณ ASP.NET จะทำการ JSON โดยอัตโนมัติทำการ deserialize ข้อมูล 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 ที่ไม่ถูกต้องคือการส่ง jQuery สตริง JSON สำหรับdataพารามิเตอร์ไม่ใช่วัตถุ JavaScript ดังนั้น jQuery จะไม่พยายาม URLEncode ข้อมูลของคุณ

ที่ฝั่งเซิร์ฟเวอร์ให้จับคู่พารามิเตอร์อินพุตของวิธีการกับรูปร่างของข้อมูลที่คุณส่งผ่าน:

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ถ้าคุณต้องการ deserializer ที่ ASMX ScriptServices ใช้ (JavaScriptSerializer) นั้นค่อนข้างยืดหยุ่นและจะทำสิ่งที่ทำได้เพื่อแปลงข้อมูลอินพุตของคุณให้เป็นประเภทฝั่งเซิร์ฟเวอร์ที่คุณระบุ


4
คุณเขียน "เพื่อให้ jQuery ไม่พยายาม URLEncode ข้อมูลของคุณ" แต่ไม่ถูกต้อง หากต้องการหยุด jquery จาก urlencoding ข้อมูลของคุณคุณต้องตั้งค่า processData เป็นเท็จ
Softlion

8
การส่งผ่านสตริงเพียงพอที่จะป้องกัน jQuery จาก URLEncoding พารามิเตอร์ data คุณสามารถตั้งค่า processData เป็นเท็จ แต่มันไม่จำเป็น (และทำอย่างนั้นเพียงอย่างเดียวโดยไม่ผ่านสตริง JSON สำหรับข้อมูลไม่เพียงพอ)
Dave Ward

1
ปัญหาเดียวกันนี้ (และคำตอบ) นำไปใช้กับ Rails เช่นกัน
GregT

2
@DaveWard contentTypeมีการพิจารณาหรือไม่หากเราใช้ GET และไม่ใช่ POST
Royi Namir

@RoyiNamir หากคุณกำลังใช้ ASMX ScriptServices หรือ ASPX WebMethods คุณต้องใช้ POST เพื่อรับคืน JSON หากคุณได้รับประเภทเนื้อหาที่ถูกต้องหรือไม่คุณจะได้รับ XML แทน
Dave Ward

19
  1. markersไม่ใช่วัตถุ JSON มันเป็นวัตถุ JavaScript ปกติ
  2. อ่านเกี่ยวกับdata:ตัวเลือก :

    ข้อมูลที่จะส่งไปยังเซิร์ฟเวอร์ มันถูกแปลงเป็นสตริงการสืบค้นหากยังไม่ได้เป็นสตริง

หากคุณต้องการส่งข้อมูลเป็น JSON คุณต้องเข้ารหัสก่อน:

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

jQuery ไม่แปลงวัตถุหรืออาร์เรย์เป็น JSON โดยอัตโนมัติ


แต่ฉันคิดว่าข้อความแสดงข้อผิดพลาดนั้นมาจากการตีความการตอบสนองของบริการ ข้อความที่คุณส่งคืนไม่ใช่ JSON สตริง JSON ต้องอยู่ในเครื่องหมายคำพูดคู่ ดังนั้นคุณต้องทำ:

return "\"received markers\"";

ฉันไม่แน่ใจว่าปัญหาที่แท้จริงของคุณกำลังส่งหรือรับข้อมูล


ขอบคุณที่คุณช่วยเฟลิกซ์ฉันคิดว่าการใช้เครื่องหมายผ่านวิธี JSON.stringyfy ฉันแปลงมันเป็นสตริงการสืบค้นฉันได้ทำตามที่คุณแนะนำ แต่น่าเสียดายที่มันไม่ทำงานฉันไม่ได้โพสต์ต่อไปนี้
รหัสฟาโรห์

เครื่องหมาย =% 7B% 22markers% 22% 3A% 5B% 7B% 22position% 22% 3A% 22,128.3657142857143% 22% 2C% 22markerPosition% 22% 3A% 227% 22% 7D% 2C% 7B% 22position% 22% 3A% 22,235.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
รหัสฟาโรห์

@ Dreamguts: มันค่อนข้างชัดเจนกับฉันในสิ่งที่คุณต้องการ คุณต้องการส่งmarkersเป็นสตริง JSON หรือไม่
เฟลิกซ์คลิง

สวัสดีเฟลิกซ์ใช่ฉันต้องการส่งวัตถุเครื่องหมายเป็นสตริง JSON เพื่อให้ฉันสามารถใช้งานได้ในเว็บเซอร์ของฉัน
รหัสฟาโรห์

@ Dreamguts: แล้วมันควรจะทำงานแบบนี้ นอกจากนี้ "รหัส" ที่คุณโพสต์ในความคิดเห็นก็โอเค แน่นอนคุณต้องถอดรหัสมันอย่างถูกต้องในฝั่งเซิร์ฟเวอร์และบางทีคุณต้องเปลี่ยนชื่อพารามิเตอร์ฉันไม่รู้
เฟลิกซ์คลิง

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 ของคุณถูกต้องให้ระบุข้อมูลที่คุณได้รับในรหัส ajax ของคุณก่อนที่จะวิเคราะห์ไปยัง 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 ...

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

โปรดปฏิบัติตามสิ่งต่อไปนี้โดย ajax call to webservice ของ java 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 เพื่อเรียก ajax ของ java webservice
Ravi Panchal
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.