অ্যাজাক্স প্রসেসিংয়ে "অবৈধ জেএসওএন আদিম"


102

আমি jQuery থেকে একটি অজ্যাক্স কলটিতে একটি ত্রুটি পাচ্ছি।

এখানে আমার jQuery ফাংশন:

function DeleteItem(RecordId, UId, XmlName, ItemType, UserProfileId) {
    var obj = {
        RecordId: RecordId,
        UserId: UId,
        UserProfileId: UserProfileId,
        ItemType: ItemType,
        FileName: XmlName
    };
    var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);

    $.ajax({
        type: "POST",
        url: "EditUserProfile.aspx/DeleteRecord",
        data: json,
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async: true,
        cache: false,
        success: function(msg) {
            if (msg.d != null) {
                RefreshData(ItemType, msg.d);
            }
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            alert("error occured during deleting");
        }
    });
}

এবং এটি আমার WebMethod:

[WebMethod]
public static string DeleteRecord(Int64 RecordId, Int64 UserId, Int64 UserProfileId, string ItemType, string FileName) {
    try {
        string FilePath = HttpContext.Current.Server.MapPath(FileName);

        XDocument xmldoc = XDocument.Load(FilePath);
        XElement Xelm = xmldoc.Element("UserProfile");
        XElement parentElement = Xelm.XPathSelectElement(ItemType + "/Fields");

        (from BO in parentElement.Descendants("Record")
         where BO.Element("Id").Attribute("value").Value == RecordId.ToString()
         select BO).Remove();
        XDocument xdoc = XDocument.Parse(Xelm.ToString(), LoadOptions.PreserveWhitespace);
        xdoc.Save(FilePath);

        UserInfoHandler obj = new UserInfoHandler();
        return obj.GetHTML(UserId, UserProfileId, FileName, ItemType, RecordId, Xelm).ToString();
    } catch (Exception ex) {
        HandleException.LogError(ex, "EditUserProfile.aspx", "DeleteRecord");
    }
    return "success";
}

কেউ দয়া করে আমাকে বলতে পারেন যে আমার কোডে কী আছে?

আমি এই ত্রুটি পাচ্ছি:

{
    "Message":"Invalid JSON primitive: RecordId.",
    "StackTrace":"
       at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()
       at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
       at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
       at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
       at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)
       at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)
       at System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)
       at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)",
    "ExceptionType":"System.ArgumentException"
}

আমি যা বুঝতে পারি না তা হ'ল। জাভাস্ক্রিপ্টটি অ্যাডআ্যালবামটোমাইপ্রোফাইল সম্পর্কে রয়েছে যখন ওয়েবমথোডটিকে ডিলিটরেকর্ড বলা হয়। আপনি কি নিশ্চিত যে সঠিক কোড টুকরা আমাদের দেখান?
জিটার

কোনও পোস্ট আপনি পোষ্টের দেখতে কেমন লাগে তা ক্যাপচার করতে পারেন (ফায়ারব্যাগ বা হোয়াট নোট ব্যবহার করে) এবং এটিকে প্রশ্নটিতে যুক্ত করতে পারেন? আমি নিশ্চিত না যে এটি পাঠানোর আগে আপনি যেভাবে এনকোড করছেন সেটিই কিন্তু আপনি এটি ( json.org/json2.js ) ব্যবহার করে এটির সিরিয়ালাইজ করার চেষ্টাও করতে পারেন ।
R0MANARMY

উত্তর:


138

ভেরিয়েবলের jsonপরে কী থাকে তা কেবল একটি অনুমান

var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);?

যদি এটির মতো কোনও বৈধ জেএসন অবজেক্ট হয় {'foo':'foovalue', 'bar':'barvalue'}তবে jQuery এটিকে জসন ডেটা হিসাবে না প্রেরণ করতে পারে তবে পরিবর্তে এটি সিরিয়ালায়িত করতে হবে foor=foovalue&bar=barvalueযাতে আপনি ত্রুটি পান"Invalid JSON primitive: foo"

পরিবর্তে ডেটাটি স্ট্রিং হিসাবে সেট করার চেষ্টা করুন

$.ajax({
    ...
    data: "{'foo':'foovalue', 'bar':'barvalue'}", //note the additional quotation marks
    ...
})

এইভাবে jQuery এর ডেটা একা রেখে সার্ভারে স্ট্রিংটি প্রেরণ করা উচিত যা ASP.NET কে জসন সার্ভারের পার্স পার্স করার অনুমতি দেয়।


6
স্পষ্টতার জন্য ধন্যবাদ, আরও একটি মন্তব্য যুক্ত করুন, আপনি সবসময় সহজ জীবনের জন্য JSON.stringify ({foo: 'foovalue', বার: 'বারভালিউ'}) এর মতো করতে পারেন
এলেন

পার্টিতে এক দশক দেরি হলেও এখনও প্রাসঙ্গিক: এটি বৈধ JSON নয়। জেএসএনে স্ট্রিংগুলি (সম্পত্তির নাম সহ) অবশ্যই ডাবল কোট ব্যবহার করতে হবে, তাই এটি হতে হবে {"foo": "foovalue", "bar": "barvalue"}। একক উদ্ধৃতি ব্যবহার করা একটি সিনট্যাক্স ত্রুটি।
মাইক 'পোম্যাক্স' কামারম্যানস

108

ব্যবহার

data : JSON.stringify(obj)

উপরের পরিস্থিতিতে আমি বিশ্বাস করি কাজ করতে হবে।

দ্রষ্টব্য: আপনার json2.js গ্রন্থাগারটি যুক্ত করা উচিত সমস্ত ব্রাউজারগুলি JSON অবজেক্ট (আই 7-) সমর্থন করে না json.js এবং json2.js এর মধ্যে পার্থক্য


4
ধন্যবাদ! সাধারণ জেএস ক্লাস ব্যবহার করার সময় এটি কাজ করে। আমি পরিবর্তন data: { JSON.stringify(obj) }করতে data: JSON.stringify(obj)(আমার জাভাস্ক্রিপ্ট / ধারাবাহিকভাবে করতে তাদেরকে JSON বর্গ শৈলী হল var myObj = { title: "x", subclass = someVar, ... } )
LKO

4
মনে রাখবেন যে সমাধানটি আপনাকে জাসনকে প্রেরণ করতে হবে তবে এটিই আপনাকে সমাধান করতে পারে ( যা আপনি সম্ভবত এসপিএন ওয়েব পরিষেবাদির সাহায্যে নিতে পারেন )। অন্যান্য ক্ষেত্রে কেবলমাত্র সরানোcontentType এবং jQuery কে ফর্ম-এনকোডড ডেটা পাস করা সহজ হতে পারে ।
GSerg

19

জিটার দ্বারা উল্লিখিত হিসাবে, $.ajaxফাংশনটি কোনও dataইউআরএল-এনকোডযুক্ত বিন্যাসে প্যারামিটার হিসাবে ব্যবহৃত কোনও অবজেক্ট / অ্যারেটিকে সিরিয়াল করে তোলে। অদ্ভুতভাবে যথেষ্ট, dataTypeপ্যারামিটারটি কেবলমাত্র সার্ভারের প্রতিক্রিয়াতে প্রযোজ্য - এবং অনুরোধের কোনও ডেটাতে নয়।

একই সমস্যাটির মুখোমুখি হওয়ার পরে আমি স্ক্রিপ্ট সার্ভিসে অনুরোধের ডেটা সঠিকভাবে এনকোড করতে jquery-json প্লাগইন ডাউনলোড এবং ব্যবহার করেছি। তারপরে, $.toJSONসার্ভারে প্রেরণের জন্য পছন্দসই যুক্তিগুলি এনকোড করতে ফাংশনটি ব্যবহার করুন :

$.ajax({
    type: "POST",
    url: "EditUserProfile.aspx/DeleteRecord",
    data: $.toJSON(obj),
    contentType: "application/json; charset=utf-8",
    dataType: "json"
    ....
});

4
dataপরামিতি কল দ্বারা উপেক্ষা করা হয়েছে তা নির্দেশ করার জন্য ধন্যবাদ ।
নোল আব্রাহামস

4
এটি কাজ করে, তবে আপনার জাভাস্ক্রিপ্ট শ্রেণিটি যদি শৈলীতে থাকে তবে ডেটা এনকোডিংয়ের বিষয়ে বিন্দুটির জন্য ধন্যবাদ যদি আমার data: { JSON.stringify(obj) }জন্য data: JSON.stringify(obj)কাজ করা হয় তবে তা পরিবর্তন করে var myObj = { title: "x", subclass = someVar, ... }
lko

19

এটি এই জাতীয় কিছু কাজ করছে

data: JSON.stringify({'id':x}),

4
এই উত্তরটি নিম্ন মানের পর্যালোচনা সারিতে পরিণত হয়েছে সম্ভবতঃ আপনি কোডটির কোনও ব্যাখ্যা সরবরাহ করেন না বলে। যদি এই কোডটি প্রশ্নের উত্তর দেয় তবে আপনার উত্তরে কোডটি ব্যাখ্যা করে কিছু পাঠ্য যুক্ত করার বিষয়ে বিবেচনা করুন। এইভাবে, আপনি আরও বেশি কিছু পাওয়ার সম্ভাবনা বেশি - এবং প্রশ্নকারীকে নতুন কিছু শিখতে সহায়তা করুন।
lmo

আমি দুটি পরামিতি পাস করতে চাই: জটিল বস্তুর অ্যারে এবং একটি পূর্ণসংখ্যা। আমি এটি করি: ডেটা: {আইটেমগুলি: JSON.stringify (myarray), myId: মান}}
দারা

14

জ্যাকুরি অ্যাজাক্স ডিফল্টরূপে কোয়েরি স্ট্রিং প্যারামিটারগুলির ফর্ম হিসাবে ডেটা পাঠাবে:

RecordId=456&UserId=123

processDataঅপশনটি মিথ্যাতে সেট না করা থাকলে সেক্ষেত্রে এটি সার্ভারে অবজেক্ট হিসাবে প্রেরণ করবে।

  • contentType বিকল্পটি সার্ভারের জন্য যা কোনও ফর্ম্যাট ক্লায়েন্ট ডেটা প্রেরণ করেছে।

  • dataType বিকল্পটি সার্ভারের জন্য যা জানায় যে কী ধরণের ডেটা ক্লায়েন্ট সার্ভার থেকে প্রত্যাশা করে।

কনটেন্ট টাইপ নির্দিষ্ট করে দেবেন না যাতে সার্ভারটি সেগুলিকে কোয়েরি হিসাবে পার্স করবে স্ট্রিং প্যারামিটারগুলি জসন হিসাবে নয়।

বা

কনটেন্টটাইপটিকে 'অ্যাপ্লিকেশন / জেসন' হিসাবে ব্যবহার করুন; চরসেট = utf-8 'এবং JSON.stringify (অবজেক্ট) ব্যবহার করুন যাতে সার্ভারটি স্ট্রিং থেকে জেসনকে deserialize করতে সক্ষম হয়।


5

আমি অনুমান করি @ জিটার তার অনুমানে ঠিক ছিল তবে তার সমাধানটি আমার পক্ষে কার্যকর হয়নি।

এটি কী কাজ করেছিল তা এখানে:

$.ajax({
    ...
    data: "{ intFoo: " + intFoo + " }",
    ...
});

আমি চেষ্টা করি নি তবে আমি মনে করি প্যারামিটারটি যদি একটি স্ট্রিং হয় তবে এটি এর মতো হওয়া উচিত:

$.ajax({
    ...
    data: "{ intFoo: " + intFoo + ", strBar: '" + strBar + "' }",
    ...
});

9
JSON অবজেক্ট তৈরি করতে যদি আমাকে এর মতো কোড (স্ট্রিং কনক্যাট) লিখতে হত, তবে আমি নিজেকে মেরে ফেলতাম (রূপকভাবে বলতে)। এখানে অবশ্যই একটি ভাল রাস্তা আছে।
পান্ডাওড

3

আমি একই সমস্যার মুখোমুখি হয়েছি, আমি যা ভাল সমাধান নিয়ে এসেছি তা নীচের মত:

এটা চেষ্টা কর...

$.ajax({
    type: "POST",
    url: "EditUserProfile.aspx/DeleteRecord",
    data: '{RecordId: ' + RecordId + ', UserId: ' + UId + ', UserProfileId:' + UserProfileId + ', ItemType: \'' + ItemType + '\', FileName: '\' + XmlName + '\'}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: true,
    cache: false,
    success: function(msg) {
        if (msg.d != null) {
            RefreshData(ItemType, msg.d);
        }
    },
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        alert("error occured during deleting");
    }
});

স্ট্রিংয়ের মান হিসাবে চিহ্নিত করার জন্য আমি স্ট্রিং টাইপ প্যারামিটারের জন্য (escape ') এস্কেপ সিকোয়েন্স অক্ষর ব্যবহার করেছি দয়া করে নোট করুন।


ডেটা: "{দ্রষ্টব্য: \" "+ $ ('# txtNotes')। ভাল () +" \ "
best

1

যদি ম্যানুয়ালি JSON ফর্ম্যাট করা হয় তবে এখানে খুব কার্যকর ব্যাবহারকারী রয়েছে : jsonlint.com

একক উদ্ধৃতির পরিবর্তে ডাবল উদ্ধৃতি ব্যবহার করুন:

অবৈধ:

{
    'project': 'a2ab6ef4-1a8c-40cd-b561-2112b6baffd6',
    'franchise': '110bcca5-cc74-416a-9e2a-f90a8c5f63a0'
}

বৈধ:

{
    "project": "a2ab6ef4-1a8c-40cd-b561-2112b6baffd6",
    "franchise": "18e899f6-dd71-41b7-8c45-5dc0919679ef"
}

0

সার্ভারে, কাস্টম অবজেক্টগুলিতে জেসনকে সিরিয়ালাইজ / ডিসায়রিয়ালাইজ করতে:

public static string Serialize<T>(T obj)
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    MemoryStream ms = new MemoryStream();
    serializer.WriteObject(ms, obj);
    string retVal = Encoding.UTF8.GetString(ms.ToArray());
    return retVal;
}

public static T Deserialize<T>(string json)
{
    T obj = Activator.CreateInstance<T>();
    MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
    obj = (T)serializer.ReadObject(ms);
    ms.Close();
    return obj;
}

0

আমারও একই প্রশ্ন ছিল. আমি পপআপ উইন্ডো ক্লোজ থেকে মূল পৃষ্ঠাকে "সংরক্ষণ করুন" বলছিলাম। দেখা গেছে যে আমি ClientIDMode="Static"একই নিয়ন্ত্রণ আইডির মাধ্যমে পিতা বা মাতা এবং পপআপ উভয় পৃষ্ঠায়ই ব্যবহার করছি । ClientIDMode="Static"কোনও একটি পৃষ্ঠা থেকে সরানো সমস্যার সমাধান করেছে।


0

এখানে ডেটাটাইপটি "জসন" সুতরাং, এপিআই কল করার সময় ডেটা / রেপারাম অবশ্যই স্ট্রিং আকারে থাকতে হবে, আপনি যতটুকু অবজেক্ট চান তবে শেষের দিকে aj .জ্যাক্সের ডেটা অবজেক্টকে স্ট্রিংফাই করে।

             let person= {  name: 'john',
                age: 22
            };

           var personStr = JSON.stringify(person); 

            $.ajax({
                url: "@Url.Action("METHOD", "CONTROLLER")",
                type: "POST",
                data: JSON.stringify( { param1: personStr } ),
                contentType: "application/json;charset=utf-8",
                dataType: "json",
        success: function (response) {

            console.log("Success");

        },
        error: function (error) {
            console.log("error found",error);
        }
    });

বা,

       $.ajax({
                url: "@Url.Action("METHOD", "CONTROLLER")",
                type: "POST",
                data: personStr,
                contentType: "application/json;charset=utf-8",
                dataType: "json",
        success: function (response) {

            console.log("Success");

        },
        error: function (error) {
            console.log("error found",error);
        }
    });

-2

এই উত্তরগুলি আমাকে কেবল অবৈধ প্যারামিটার এবং অনুপস্থিত প্যারামিটারের মধ্যে পিছনে পিছনে পিছনে ছুঁড়েছিল।

এটি আমার জন্য কাজ করেছে, কেবল উদ্ধৃতিগুলিতে স্ট্রিং ভেরিয়েবলগুলি মোড়ানো ...

data: { RecordId: RecordId,
            UserId: UId,
            UserProfileId: UserProfileId,
            ItemType: '"' +  ItemType + '"',
            FileName: '"' +  XmlName + '"'
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.