Ajax 처리에서 "유효하지 않은 JSON 원시"
문제
jQuery의 Ajax 호출에서 오류가 발생합니다.
내 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
후에 포함
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는 데이터를 내버려두고 서버로 문자열을 보내야합니다.
다른 팁
사용
data : JSON.stringify(obj)
위의 상황에서 나는 내가 믿었을 것이다.
참고 : JSON2.JS 라이브러리를 추가해야합니다. 모든 브라우저는 해당 JSON 객체 (IE7-)를 지원하지 않습니다.JSON.JS와 JSON2.JS의 차이
지터가 언급 한 바와 같이 $.ajax
함수는 data
URL 인코딩 형식으로 매개 변수. 이상하게도, dataType
매개 변수는 요청의 데이터가 아닌 서버의 응답에만 적용됩니다.
내가 다운로드하고 사용했던 것과 동일한 문제를 발견 한 후 jQuery-JSON 플러그인 요청 데이터를 ScriptService에 올바르게 인코딩합니다. 그런 다음 사용했습니다 $.toJSON
기능 서버로 보낼 원하는 인수를 인코딩하는 기능 :
$.ajax({
type: "POST",
url: "EditUserProfile.aspx/DeleteRecord",
data: $.toJSON(obj),
contentType: "application/json; charset=utf-8",
dataType: "json"
....
});
이런 식으로 작동합니다
data: JSON.stringify({'id':x}),
jQuery ajax는 다음과 같은 쿼리 문자열 매개 변수로 데이터를 기본값으로 전송합니다.
RecordId=456&UserId=123
그렇지 않다면 processData
옵션은 False로 설정되며,이 경우 서버로 객체로 전송됩니다.
contentType
옵션은 형식 클라이언트가 데이터를 보낸 서버에 대한 옵션입니다.dataType
옵션은 서버에서 어떤 유형의 데이터 클라이언트가 서버에서 기대하고 있음을 알려주는 옵션입니다.
서버가 JSON이 아닌 쿼리 문자열 매개 변수로 구문 분석되도록 ContentType를 지정하지 마십시오.
또는
ContentType를 'Application/JSON; charset = utf-8 '이고 json.stringify (객체)를 사용하여 서버가 String에서 json을 사로화 할 수 있도록하십시오.
@jitter가 그의 추측에 옳다고 생각하지만 그의 해결책은 저에게 효과가 없었습니다.
다음은 효과가 있습니다.
$.ajax({
...
data: "{ intFoo: " + intFoo + " }",
...
});
나는 시도하지 않았지만 매개 변수가 문자열이라면 다음과 같아야한다고 생각합니다.
$.ajax({
...
data: "{ intFoo: " + intFoo + ", strBar: '" + strBar + "' }",
...
});
나는 같은 문제에 직면하고 있었는데, 좋은 솔루션과 함께 온 것은 다음과 같습니다.
이 시도...
$.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");
}
});
문자열 값으로 표시하기 위해 사용한 ( ') 탈출 시퀀스 문자에 대해서는 여기에 참고하십시오.
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"
}
서버에서 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;
}
나는 같은 문제가 있었다. 팝업 창에서 부모 페이지를 "저장"에 전화했습니다. 내가 사용하고 있음을 발견했습니다 ClientIDMode="Static"
동일한 제어 ID가있는 부모와 팝업 페이지에서. 풀이 ClientIDMode="Static"
페이지 중 하나에서 문제를 해결했습니다.
이 답변으로 인해 유효하지 않은 매개 변수와 누락 된 매개 변수 사이를 오가는 것이 방금 튀어 나왔습니다.
이것은 나에게 효과가 있었고, 그냥 인용구로 문자열 변수를 랩핑했습니다 ...
data: { RecordId: RecordId,
UserId: UId,
UserProfileId: UserProfileId,
ItemType: '"' + ItemType + '"',
FileName: '"' + XmlName + '"'
}