"Invalid JSON primitive" in der Ajax-Verarbeitung
Frage
Ich erhalte eine Fehlermeldung in einem ajax-Aufruf von jQuery.
Hier ist meine jQuery-Funktion:
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");
}
});
}
und das ist mein 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";
}
Kann jemand bitte sagen Sie mir, was ist falsch in meinem code?
Ich bin immer diese Fehlermeldung:
{
"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"
}
Lösung
Nur eine Vermutung, was die Variable json
enthält nach
var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);?
Wenn es ein gültiges JSON-Objekt wie {'foo':'foovalue', 'bar':'barvalue'}
ist dann könnte jQuery es nicht als JSON-Daten senden, sondern es stattdessen serialisiert so foor=foovalue&bar=barvalue
Sie den Fehler "Invalid JSON primitive: foo"
Versuchen Sie stattdessen die Daten als String Einstellung
$.ajax({
...
data: "{'foo':'foovalue', 'bar':'barvalue'}", //note the additional quotation marks
...
})
Auf diese Weise jQuery sollten die Daten in Ruhe lassen und die Zeichenfolge senden, wie auf dem Server vorhanden ist, die ASP.NET ermöglichen sollte, die json Server-Seite zu analysieren.
Andere Tipps
Mit
data : JSON.stringify(obj)
in der obigen Situation funktioniert hätte, glaube ich.
Hinweis: Sie sollten json2.js Bibliothek hinzufügen alle Browser unterstützen nicht, dass JSON-Objekt (IE7-) Unterschied zwischen json.js und json2.js
Wie von Jitter, serialisiert die $.ajax
Funktion jedes Objekt / Array verwendet als data
Parameter in eine URL-Format. Merkwürdigerweise gelten die dataType
Parameter nur auf die Antwort vom Server - und nicht auf alle Daten in der Anfrage.
Nach dem gleichen Problem zu begegnen ich heruntergeladen und verwendet die jquery-json-Plugin korrekt codiert die Anforderungsdaten an das Script. Dann verwendet die $.toJSON
Funktion die gewünschten Argumente zu codieren, um den Server zu senden:
$.ajax({
type: "POST",
url: "EditUserProfile.aspx/DeleteRecord",
data: $.toJSON(obj),
contentType: "application/json; charset=utf-8",
dataType: "json"
....
});
Es funktioniert so etwas wie diese
data: JSON.stringify({'id':x}),
Jquery Ajax werden Standard senden die Daten als Abfrage-string-Parameter in der form:
RecordId=456&UserId=123
es sei denn, der processData
option auf false festgelegt ist, in welchem Fall es wird gesendet werden als Objekt auf dem server.
contentType
option ist für den server, in welchem format AUFTRAGGEBER hat die Daten versendet.dataType
option ist für den server, die sagt, welche Art von Daten client erwartet wieder vom server.
Nicht angegeben contentType, so dass server analysieren Sie die Abfrage String-Parameter nicht als json.
ODER
Verwenden contentType als 'application/json;charset=utf-8' - und JSON verwenden.stringify(Objekt), so dass server in der Lage sein würde zu Deserialisieren von json von string.
Ich denke, @jitter hat recht in seiner Vermutung, aber seine Lösung nicht für mich arbeiten.
Hier ist, was es hat funktioniert:
$.ajax({
...
data: "{ intFoo: " + intFoo + " }",
...
});
Ich habe nicht versucht, aber ich denke, wenn die parametter ein String ist es so sein sollte:
$.ajax({
...
data: "{ intFoo: " + intFoo + ", strBar: '" + strBar + "' }",
...
});
Ich habe das gleiche Problem konfrontiert, was ich kam mit einer guten Lösung ist wie folgt:
Versuchen Sie, diese ...
$.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");
}
});
Bitte beachten Sie hier für String-Typen Parameter i verwendet hat (\ ') Escape-Sequenz-Zeichen für sie als String-Wert bezeichnet.
Wenn manuell JSON formatiert werden kann, ist ein sehr handliches Validator hier: jsonlint.com
Verwenden Sie doppelte Anführungszeichen statt einfacher Anführungszeichen:
Ungültig:
{
'project': 'a2ab6ef4-1a8c-40cd-b561-2112b6baffd6',
'franchise': '110bcca5-cc74-416a-9e2a-f90a8c5f63a0'
}
Gültig:
{
"project": "a2ab6ef4-1a8c-40cd-b561-2112b6baffd6",
"franchise": "18e899f6-dd71-41b7-8c45-5dc0919679ef"
}
Auf dem Server, auf Serialize / Deserialize json, um benutzerdefinierte Objekte:
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;
}
Ich hatte das gleiche Problem. Ich rief übergeordnete Seite „Save“ von Popup-Fenster zu schließen. Fand, dass ich ClientIDMode="Static"
auf Eltern und Popup-Seite mit dem gleichen Steuer-ID wurde mit. Entfernen ClientIDMode="Static"
von einer der Seiten ausgewertete das Problem.
diese Antworten hatte nur Prellen mich hin und her zwischen ungültiger Parameter und fehlende Parameter.
das für mich gearbeitet, nur String-Variablen in Anführungszeichen wickeln ...
data: { RecordId: RecordId,
UserId: UId,
UserProfileId: UserProfileId,
ItemType: '"' + ItemType + '"',
FileName: '"' + XmlName + '"'
}