अजाक्स प्रसंस्करण में "अमान्य JSON आदिम"


101

मुझे 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"
}

जो मुझे समझ नहीं आ रहा है। जावास्क्रिप्ट AddAlbumToMyProfile के बारे में है जबकि WebMethod को DeleteRecord कहा जाता है। क्या आप वाकई हमें सही कोड टुकड़े दिखा रहे हैं?
जिटर

कोई भी मौका जिसे आप POST की तरह देखते हैं (फायरबग या व्हाटसप का उपयोग करके) कैप्चर कर सकते हैं और इसे प्रश्न में जोड़ सकते हैं? मुझे यकीन नहीं है कि अगर आप इसे भेजने से पहले डेटा को एन्कोडिंग कर रहे हैं, लेकिन आप इसे ( json.org/json2.js ) का उपयोग करके इसे क्रमबद्ध करने का भी प्रयास कर सकते हैं ।
R0MANARMY

जवाबों:


135

बस एक अनुमान है कि चर के jsonबाद क्या होता है

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

यदि यह एक मान्य json ऑब्जेक्ट है, {'foo':'foovalue', 'bar':'barvalue'}तो jQuery इसे json डेटा के रूप में नहीं भेज सकता है, लेकिन इसके बजाय इसे क्रमबद्ध करें ताकि foor=foovalue&bar=barvalueआप त्रुटि प्राप्त कर सकें"Invalid JSON primitive: foo"

इसके बजाय डेटा को स्ट्रिंग के रूप में सेट करने का प्रयास करें

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

इस तरह jQuery को डेटा को अकेला छोड़ देना चाहिए और स्ट्रिंग को सर्वर पर भेजना चाहिए जो ASP.NET को json सर्वर पक्ष को पार्स करने की अनुमति देनी चाहिए।


5
स्पष्टीकरण के लिए धन्यवाद, एक और टिप्पणी जोड़ें, आप हमेशा आसान जीवन के लिए JSON.stringify ({foo: 'foovalue', bar: 'barvalue'}) की तरह कर सकते हैं
Elaine

पार्टी में एक दशक देर हो चुकी है, लेकिन अभी भी प्रासंगिक है: यह मान्य JSON नहीं है। JSON में स्ट्रिंग्स (संपत्ति के नाम सहित) को दोहरे उद्धरण चिह्नों का उपयोग करना चाहिए , इसलिए यह होना चाहिए {"foo": "foovalue", "bar": "barvalue"}। एकल उद्धरणों का उपयोग करना एक वाक्यविन्यास त्रुटि है।
माइक 'पोमैक्स' कमरमन्स

108

का उपयोग करते हुए

data : JSON.stringify(obj)

उपरोक्त स्थिति में मुझे विश्वास है कि काम किया होगा।

नोट: आपको json2.js लाइब्रेरी को जोड़ना चाहिए जो सभी ब्राउज़र समर्थन नहीं करते हैं कि JSON ऑब्जेक्ट (IE7-) json.js और json2.j के बीच अंतर करता है


3
धन्यवाद! सरल जेएस कक्षाओं का उपयोग करते समय यह काम करता है। मैं बदल data: { JSON.stringify(obj) }करने के लिए data: JSON.stringify(obj)(मेरे जावास्क्रिप्ट / क्रमानुसार करने JSON वर्ग शैली की है var myObj = { title: "x", subclass = someVar, ... } )
LKO

1
ध्यान दें कि यह समाधान है बशर्ते आपको वास्तव में JSON ( जो आप asp.net वेब सेवाओं के साथ हो सकता है ) को भेजने की आवश्यकता है । अन्य मामलों में इसे दूरcontentType करना आसान हो सकता है और jQuery को फॉर्म-एन्कोडेड डेटा को पास करने देना चाहिए।
GSerg

19

जैसा कि घबराना द्वारा उल्लेख किया गया है, $.ajaxफ़ंक्शन किसी भी ऑब्जेक्ट / सरणी dataको एक यूआरएल-एन्कोडेड प्रारूप में पैरामीटर के रूप में उपयोग करता है । अजीब तरह से पर्याप्त है, dataTypeपैरामीटर केवल सर्वर से प्रतिक्रिया पर लागू होता है - और अनुरोध में किसी भी डेटा के लिए नहीं।

उसी समस्या का सामना करने के बाद मैंने डाउनलोड किया और jquery-json प्लगइन का उपयोग करके ScriptService के लिए अनुरोध डेटा को सही ढंग से एन्कोड किया। फिर, $.toJSONसर्वर को भेजने के लिए वांछित तर्कों को एनकोड करने के लिए फ़ंक्शन का उपयोग किया :

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

2
यह इंगित करने के लिए धन्यवाद कि dataपैरामीटर को कॉल द्वारा अनदेखा किया गया है।
नोएल अब्राहम

3
यह काम करता है, लेकिन मेरे data: { JSON.stringify(obj) }लिए data: JSON.stringify(obj)काम करने के लिए बदल रहा है अगर आपकी जावास्क्रिप्ट क्लास var myObj = { title: "x", subclass = someVar, ... } डेटा एन्कोडिंग के बारे में बिंदु के लिए धन्यवाद है।
lko

19

यह कुछ इस तरह काम कर रहा है

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

3
यह उत्तर कम गुणवत्ता की समीक्षा कतार में बदल गया, संभवतः क्योंकि आप कोड का कोई विवरण प्रदान नहीं करते हैं। यदि यह कोड प्रश्न का उत्तर देता है, तो अपने उत्तर में कोड को समझाते हुए कुछ पाठ जोड़ने पर विचार करें। इस तरह, आपको अधिक उत्थान प्राप्त करने की संभावना है - और प्रश्नकर्ता को कुछ नया सीखने में मदद मिलेगी।
एलएमओ

मैं दो मापदंडों को पारित करना चाहता हूं: जटिल ऑब्जेक्ट की एक सरणी और पूर्णांक। मैं इसे करता हूं: डेटा: {आइटम: JSON.stringify (मायार्रे), myId: value}।
ए। दारा

उत्तर पोस्ट करने के लिए धन्यवाद। यह मेरे लिए काम किया।
ZMAX

13

Jquery Ajax डेटा को क्वेरी स्ट्रिंग पैरामीटर के रूप में डिफ़ॉल्ट रूप से भेजेगा:

RecordId=456&UserId=123

जब तक processDataविकल्प गलत पर सेट नहीं होता है , तब तक यह सर्वर के ऑब्जेक्ट के रूप में भेजा जाएगा।

  • contentType विकल्प उस सर्वर के लिए है जिसमें क्लाइंट ने किस प्रारूप में डेटा भेजा है।

  • dataType विकल्प सर्वर के लिए है जो बताता है कि सर्वर से किस प्रकार के डेटा क्लाइंट की उम्मीद है।

कंटेंट टाइप निर्दिष्ट न करें, ताकि सर्वर उन्हें क्वेरी स्ट्रिंग स्ट्रिंग के रूप में पार्स कर सकेगा न कि जसन।

या

ContentType का उपयोग 'एप्लिकेशन / json' के रूप में करें; charset = utf-8 'और JSON.stringify (ऑब्जेक्ट) का उपयोग करें ताकि सर्वर स्ट्रिंग से जसन को डिसेर्बलाइज कर सके।


5

मुझे लगता है कि @jitter उनके अनुमान में सही था, लेकिन उसका समाधान मेरे लिए कारगर नहीं था।

यहाँ यह काम किया है:

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

कृपया स्ट्रिंग प्रकार के पैरामीटर के लिए कृपया ध्यान दें कि मैंने (\ ') से बचने के लिए इसे स्ट्रिंग मान के रूप में उपयोग करने के लिए अनुक्रम चरित्र का उपयोग किया है।


डेटा: "{नोट्स: \" "+ $ ('# txtNotes')। वैल () +" \ "}
bestinamir

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

सर्वर पर, कस्टम ऑब्जेक्ट्स के लिए json को सीरीज़ / डिस्क्रिअलाइज़ करने के लिए:

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

यहाँ dataTpe "json" है, इसलिए API को कॉल करते समय डेटा / reqParam को स्ट्रिंग के रूप में होना चाहिए, बहुत से ऑब्जेक्ट जितना चाहें, लेकिन पिछले $ $ में .ajax का डेटा ऑब्जेक्ट को स्ट्रिंग करता है।

             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 + '"'
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.