Ajax işlemede "geçersiz JSON ilkel"


101

JQuery'den bir ajax çağrısında hata alıyorum.

İşte jQuery işlevim:

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

ve bu benim 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";
}

Lütfen kimse bana kodumda neyin yanlış olduğunu söyleyebilir mi

Bu hatayı alıyorum:

{
    "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"
}

Anlamadığım şey. Javascript AddAlbumToMyProfile hakkındadır, WebMethod ise DeleteRecord olarak adlandırılır. Bize doğru kod parçalarını gösterdiğinden emin misin?
titreme

POST'un neye benzediğini (kundakçı veya başka bir şey kullanarak) yakalayıp soruya ekleme şansınız var mı? Verileri göndermeden önce kodlamanın bu şekilde olup olmadığından emin değilim, ancak bunu kullanarak seri hale getirmeyi de deneyebilirsiniz ( json.org/json2.js ).
R0MANARMY

Yanıtlar:


136

Değişkenin ne jsoniçerdiğini tahmin et.

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

O {'foo':'foovalue', 'bar':'barvalue'}zamanki gibi geçerli bir json nesnesiyse, jQuery onu json verisi olarak göndermeyebilir, bunun yerine serileştirerek foor=foovalue&bar=barvaluehatayı alırsınız"Invalid JSON primitive: foo"

Bunun yerine verileri dize olarak ayarlamayı deneyin

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

Bu şekilde jQuery, verileri yalnız bırakmalı ve dizeyi olduğu gibi, ASP.NET'in json sunucu tarafını ayrıştırmasına izin vermesi gereken sunucuya göndermelidir.


5
açıklama için teşekkürler, bir yorum daha ekleyin, daha kolay bir yaşam için her zaman JSON.stringify ({foo: 'foovalue', bar: 'barvalue'}) gibi yapabilirsiniz
Elaine

Partiye on yıl geç, ancak yine de geçerli: bu geçerli JSON değil. JSON'daki dizeler (özellik adları dahil) çift ​​tırnak kullanmalıdır , bu nedenle olması gerekir {"foo": "foovalue", "bar": "barvalue"}. Tek tırnakların kullanılması bir sözdizimi hatasıdır.
Mike 'Pomax' Kamermans

108

Kullanma

data : JSON.stringify(obj)

Yukarıdaki durumda işe yarayacağına inanıyorum.

Not: json2.js kitaplığı eklemelisiniz, tüm tarayıcılar bu JSON nesnesini desteklemiyor (IE7-) json.js ve json2.js arasındaki fark


3
Teşekkürler! Basit JS sınıflarını kullanırken bu işe yarar. Değiştim data: { JSON.stringify(obj) }için data: JSON.stringify(obj)(My javascript / serialize için JSON sınıf tarzı olan var myObj = { title: "x", subclass = someVar, ... } )
LKO

1
Bunun, JSON göndermeniz gereken ( asp.net web hizmetlerinde olabileceğiniz ) sağlanan çözüm olduğunu unutmayın . Diğer durumlarda, yalnızca kaldırıpcontentType jQuery'nin form kodlu verileri geçmesine izin vermek daha kolay olabilir .
GSerg

19

Jitter tarafından belirtildiği gibi, $.ajaxişlev dataparametre olarak kullanılan herhangi bir nesneyi / diziyi url kodlu bir biçime serileştirir . İşin garibi, dataTypeparametre yalnızca sunucudan gelen yanıt için geçerlidir - istekteki herhangi bir veri için geçerli değildir.

Aynı sorunla karşılaştıktan sonra , istek verilerini ScriptService'e doğru şekilde kodlamak için jquery-json eklentisini indirdim ve kullandım . Ardından, $.toJSONsunucuya göndermek için istenen bağımsız değişkenleri kodlamak için işlevi kullandı :

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

2
dataçağrının parametrenin yok sayıldığını belirttiğiniz için teşekkürler
Noel Abrahams

3
Bu işe yarıyor, ancak veri kodlamasıyla ilgili nokta sayesinde javascript sınıfınız stilde ise benim data: { JSON.stringify(obj) }için data: JSON.stringify(obj)işe yaradı var myObj = { title: "x", subclass = someVar, ... } .
lko

19

bunun gibi çalışıyor

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

3
Muhtemelen kodla ilgili herhangi bir açıklama yapmadığınız için, bu yanıt düşük kaliteli inceleme sırasında ortaya çıktı. Bu kod soruyu yanıtlıyorsa, cevabınıza kodu açıklayan bir metin eklemeyi düşünün. Bu şekilde, daha fazla olumlu oy alma olasılığınız çok daha yüksektir ve soru soran kişinin yeni bir şeyler öğrenmesine yardımcı olur.
lmo

İki parametre iletmek istiyorum: karmaşık bir nesne dizisi ve bir tam sayı. Yapıyorum: veri: {öğeler: JSON.stringify (myarray), myId: value}.
A.Dara

13

Jquery Ajax, verileri varsayılan olarak aşağıdaki gibi sorgu dizesi parametreleri biçiminde gönderir:

RecordId=456&UserId=123

sürece processDataseçenek false olarak ayarlanır, bu durumda o sunucuya nesne olarak gönderilecektir.

  • contentType seçenek, istemcinin verileri gönderdiği sunucu içindir.

  • dataType seçenek, sunucudan ne tür bir veri istemcisinin geri beklediğini söyleyen sunucu içindir.

Server'ın json olarak değil sorgu String parametreleri olarak ayrıştırması için contentType'ı belirtmeyin.

VEYA

ContentType'ı 'application / json olarak kullanın; charset = utf-8 've JSON.stringify (nesne) kullanın, böylece sunucu json dizisinden json serisini kaldırabilir.


5

Sanırım @jitter kendi tahmininde haklıydı, ancak çözümü benim için işe yaramadı.

İşte işe yaradığı şey:

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

Denemedim ama bence parametre bir dizge ise şöyle olmalı:

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

9
JSON nesneleri oluşturmak için böyle bir kod (string concat) yazmam gerekirse, kendimi öldürürdüm (mecazi anlamda). Daha iyi bir yol olmalı.
PandaWood

3

Aynı sorunla karşı karşıyaydım, iyi bir çözümle geldiğim şey aşağıdaki gibidir:

Bunu dene...

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

Lütfen burada dize türü parametresi için onu dize değeri olarak belirtmek için (\ ') kaçış dizisi karakterini kullandım.


data: "{Notlar: \" "+ $ ('# txtNotes'). val () +" \ "}
bestinamir

1

JSON'u manuel olarak biçimlendiriyorsanız, burada çok kullanışlı bir doğrulayıcı var: jsonlint.com

Tek tırnak yerine çift tırnak kullanın:

Geçersiz:

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

Geçerli:

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

0

Sunucuda, json'u özel nesnelere Serileştirmek / Seri Durumdan Çıkarmak için:

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

Ben de aynı sorunu yaşadım. Açılır pencere Kapat'tan üst sayfayı "Kaydet" olarak adlandırıyordum. ClientIDMode="Static"Aynı kontrol kimliğine sahip hem ana sayfada hem de açılır sayfada kullandığımı fark ettim . ClientIDMode="Static"Sayfalardan birinin kaldırılması sorunu çözdü.


0

Burada dataTpe "json" dır, dolayısıyla, API çağrılırken data / reqParam string şeklinde olmalıdır, istediğiniz kadar çok nesne ama sonunda $ .ajax'ın data içinde nesneyi dizgileştirir.

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

VEYA,

       $.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

bu cevaplar beni geçersiz parametre ile eksik parametre arasında gidip gelmeme neden oldu.

bu benim için çalıştı, sadece dize değişkenlerini tırnak içine alın ...

data: { RecordId: RecordId,
            UserId: UId,
            UserProfileId: UserProfileId,
            ItemType: '"' +  ItemType + '"',
            FileName: '"' +  XmlName + '"'
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.