জ্যাকোরি অ্যাজাক্স ওয়েব সার্ভিসে জেসন পোস্ট করছেন


238

আমি একটি এসপি নেট ওয়েব সার্ভিসে একটি জেএসওএন অবজেক্ট পোস্ট করার চেষ্টা করছি।

আমার জসন এর মত দেখাচ্ছে:

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

আমি আমার জসন বস্তুকে স্ট্রাইফাই করতে json2.js ব্যবহার করছি।

এবং আমি আমার ওয়েব সার্ভিসে পোস্ট করার জন্য 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);
        }
  });

আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

"অবৈধ জেএসওএন আদিম:

আমি এটি সম্পর্কিত অনেকগুলি পোস্ট পেয়েছি এবং এটি সত্যিই একটি সাধারণ সমস্যা বলে মনে হচ্ছে তবে আমি সমস্যার সমাধান করার চেষ্টা করছি না।

সার্ভারে ফায়ারব্যাগ যা পোস্ট করা হচ্ছে তা দেখে মনে হচ্ছে এটি:

চিহ্নিতকারী% 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 তালিকাভুক্তদের মধ্যে 'ব্যর্থতা' একটি সম্ভাব্য সেটিংস হিসাবে সরবরাহ করা হয়নি ... সম্ভবত আপনি এর পরিবর্তে 'ত্রুটি' দিয়ে ভুল করেছেন?
ড্যানিকোট্রা

উত্তর:


390

আপনি আপনার ডেটা আরও শক্তিশালী করার জন্য json2.js ব্যবহার করে উল্লেখ করেছেন, তবে পোষ্টড ডেটা URLEncoded 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);
    }
});

অবৈধ জেএসওএন আদিম সমস্যা এড়ানোর চাবিকাঠিটি হল dataজাভাস্ক্রিপ্ট অবজেক্ট নয়, প্যারামিটারের জন্য jQuery একটি 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যদি পছন্দ করেন তবে আপনি কোনও অ্যারেও গ্রহণ করতে পারেন। এএসএমএক্স স্ক্রিপ্ট সার্ভিসেস (জাভাস্ক্রিপ্টসারিয়ালাইজার) যে ডিসরিয়ালাইজার ব্যবহার করে তা বেশ নমনীয় এবং আপনার ইনপুট ডেটাটিকে আপনি যে সার্ভার-সাইড টাইপের নির্দিষ্ট করে তা রূপান্তর করতে এটি যা করতে পারে তা করবে।


4
আপনি লিখেছেন "যাতে jQuery আপনার ডেটা ইউআরলিনকোড করার চেষ্টা করে না" ", তবে এটি সঠিক নয়। আপনার ডেটা ইউলিংকডিং থেকে jquery কে থামাতে আপনাকে অবশ্যই প্রসেসডাটাটিকে মিথ্যাতে সেট করতে হবে।
সফটলিয়ন

8
স্ট্রিংয়ে পাস করা jQuery ডেটা প্যারামিটারটিকে ইউআরএলএনসিডিং থেকে রোধ করার জন্য যথেষ্ট। আপনি প্রসেসডাটাটিকে মিথ্যাতে সেট করতে পারেন, তবে এটি অনাবশ্যক (এবং এটি একা করছেন, ডেটাটির জন্য জেএসওএন স্ট্রিংয়ে না গিয়েই যথেষ্ট নয়)।
ডেভ ওয়ার্ড

1
এই একই সমস্যা (এবং উত্তর) এছাড়াও রেলগুলির জন্য প্রযোজ্য।
গ্রেগটি

2
@ ডেভ ওয়ার্ড কি contentTypeবিবেচনা করা হয় যদি আমরা জিইটি ব্যবহার করি এবং পোস্ট না করি?
রই নমির

@ রইনিমির আপনি যদি এএসএমএক্স স্ক্রিপ্ট সার্ভিস বা এএসপিএক্স ওয়েবমেথডগুলি ব্যবহার করেন তবে তাদের জেএসএন ফেরত পেতে আপনার পোস্ট ব্যবহার করতে হবে। যদি আপনি পান, বিষয়বস্তু-টাইপ সঠিক বা না, আপনি এর পরিবর্তে এক্সএমএল পাবেন।
ডেভ ওয়ার্ড

19
  1. markersকোনও JSON অবজেক্ট নয়। এটি একটি সাধারণ জাভাস্ক্রিপ্ট অবজেক্ট।
  2. data:বিকল্পটি সম্পর্কে পড়ুন :

    সার্ভারে ডেটা প্রেরণ করা হবে। এটি ইতিমধ্যে স্ট্রিং না হলে এটি একটি ক্যোয়ারী স্ট্রিংয়ে রূপান্তরিত হয় ।

আপনি যদি JSON হিসাবে ডেটা প্রেরণ করতে চান তবে আপনাকে প্রথমে এটি এনকোড করতে হবে:

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

jQuery বস্তু বা অ্যারেগুলিকে স্বয়ংক্রিয়ভাবে JSON এ রূপান্তর করে না।


তবে আমি ধরে নিই যে ত্রুটি বার্তাটি পরিষেবার প্রতিক্রিয়াটি ব্যাখ্যা করার মাধ্যমে আসে। আপনি যে পাঠ্যটি পাঠিয়েছেন তা JSON নয়। জেএসওএন স্ট্রিংগুলি ডাবল কোটে আবদ্ধ থাকতে হবে। সুতরাং আপনি করতে হবে:

return "\"received markers\"";

আপনার সত্যিকারের সমস্যা ডেটা প্রেরণ বা গ্রহণ করছে কিনা তা আমি নিশ্চিত নই।


ফেলিক্সকে সাহায্য করার জন্য আপনাকে ধন্যবাদ, আমি ভেবেছিলাম যে 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
কোড ফেরাউন

@ ড্রিমগেটস: আপনি কী চান তা আমার কাছে কিছুটা অস্পষ্ট। আপনি কি markersJSON স্ট্রিং হিসাবে প্রেরণ করতে চান ?
ফেলিক্স ক্লিং

হাই ফেলিক্স, হ্যাঁ আমি JSON স্ট্রিং হিসাবে চিহ্নিতকারীদের অবজেক্টটি প্রেরণ করতে চাই যাতে আমি এটি আমার ওয়েব সার্ভিসে ব্যবহার করতে পারি।
কোড ফেরাউন

@ ড্রিমগেটস: তারপরে এটি এভাবে কাজ করা উচিত। এছাড়াও আপনি মন্তব্যটিতে পোস্ট করেছেন "কোড" ঠিক আছে বলে মনে হচ্ছে। অবশ্যই আপনাকে এটি সার্ভারের পাশে সঠিকভাবে ডিকোড করতে হবে এবং সম্ভবত আপনাকে প্যারামিটারের নামটি পরিবর্তন করতে হবে, আমি জানি না।
ফেলিক্স ক্লিং

3

আমি ডেভ ওয়ার্ডের সমাধান চেষ্টা করেছিলাম। কনটেন্টটাইপ সেট হওয়ার কারণে পোস্টের অনুরোধের পে- লোড অংশে ব্রাউজার থেকে ডেটা অংশটি প্রেরণ করা হচ্ছিল না "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

আমি এটিরও মুখোমুখি হয়েছি এবং এটিই আমার সমাধান।

ডেটা পার্স করার সময় আপনি যদি কোনও অবৈধ জসন অবজেক্টের ব্যতিক্রমের মুখোমুখি হয়ে থাকেন, যদিও আপনি জানেন যে আপনার জসন স্ট্রিংটি সঠিক, জেএসএনে পার্স করার আগে আপনার অজ্যাক্স কোডটিতে প্রাপ্ত ডেটাটিকে স্ট্রাইফাই করুন:

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

    });

আমি জসনে লগইন সম্পর্কিত তথ্য পোস্ট করছি এবং এর মতো একটি স্ট্রিং "Success"পাচ্ছি, তবে আমি সাড়া পাচ্ছি না।


1
এটি প্রশ্নের উত্তর নয়। আপনি যদি প্রশ্নটি জিজ্ঞাসা করতে চান তবে "প্রশ্ন" মেনুতে যান এবং "প্রশ্ন জিজ্ঞাসা করুন" এ ক্লিক করুন এবং যদি আপনার প্রশ্নটি এই প্রশ্নের সাথে সম্পর্কিত হয় তবে আপনার প্রশ্নের রেফারেন্স লিঙ্কটি সরবরাহ করুন।
মিত্তাল প্যাটেল 4

-2

দয়া করে এটিকে জাভা ভার প্যারাম = serv feildName: feildValue web এর ওয়েবসার্চিতে অজ্যাক্স কল দিয়ে অনুসরণ করুন; JSON.stringify ({তথ্য: প্যারাম})

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

এখানে জাভা ওয়েব সার্ভিসের এজ্যাক্স কলটিতে জসনগুলিতে কীভাবে অবজেক্ট পাসের তালিকাভুক্ত করা যায়।
রবি পাঁচাল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.