Ajax 처리에 "잘못된 JSON 기본값"이(가) 있습니다.
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
에 포함합니다.
var json = Sys.Serialization.JavaScriptSerializer.serialize(obj);?
약그것다같객음과유은체효면라한만이처럼 유효한 라면.{"foo":"foovalue", "bar":"barvalue"}
" json 데이터로 직렬화할 수 .foor=foovalue&bar=barvalue
그래서 당신은 오류를 얻습니다."Invalid JSON primitive: foo"
대신 데이터를 문자열로 설정해 보십시오.
$.ajax({
...
data: '{"foo":"foovalue", "bar":"barvalue"}', //note the additional quotation marks
...
})
이런 식으로 jQuery는 데이터를 그대로 두고 ASP를 허용하는 서버로 문자열을 전송해야 합니다.Json 서버 측을 구문 분석하는 NET.
사용.
data : JSON.stringify(obj)
위와 같은 상황이라면 효과가 있었을 것이라고 생각합니다.
참고: json2.js 라이브러리를 추가해야 합니다. 모든 브라우저가 JSON 개체(IE7-) json.js와 json2.js의 차이를 지원하지 않습니다.
이렇게 작동하고 있습니다.
data: JSON.stringify({'id':x}),
와 같이, 지가지적듯이했터,이▁as,$.ajax
은 함는사어모든객용/체레이를직으로 되는 모든 합니다.data
매개 변수를 url-vlan 형식으로 변환합니다. 하게도그상이, 그▁oddly.dataType
매개 변수는 서버의 응답에만 적용되고 요청의 데이터에는 적용되지 않습니다.
동일한 문제가 발생한 후 요청 데이터를 ScriptService에 올바르게 인코딩하기 위해 jquery-json 플러그인을 다운로드하여 사용했습니다.그런 다음 사용했습니다.$.toJSON
: 서로보원인하인수코함는수:
$.ajax({
type: "POST",
url: "EditUserProfile.aspx/DeleteRecord",
data: $.toJSON(obj),
contentType: "application/json; charset=utf-8",
dataType: "json"
....
});
Jquery Ajax는 기본적으로 다음과 같은 쿼리 문자열 매개 변수 형식으로 데이터를 보냅니다.
RecordId=456&UserId=123
이 processData
옵션이 false로 설정되어 있으며, 이 경우 서버에 개체로 전송됩니다.
contentType
옵션은 클라이언트가 데이터를 전송한 형식의 서버에 대한 것입니다.dataType
옵션은 클라이언트가 서버에서 반환할 것으로 예상되는 데이터 유형을 알려주는 서버에 대한 것입니다.
내용 지정 안 함서버가 json이 아닌 쿼리 String 매개 변수로 구문 분석하도록 입력합니다.
OR
내용 사용서버가 문자열에서 json을 역직렬화할 수 있도록 'application/json; charset=utf-8'로 입력하고 JSON.stringify(object)를 사용합니다.
@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");
}
});
문자열 형식 매개 변수에 대해 문자열 값으로 표시하기 위해 (\") 이스케이프 시퀀스 문자를 사용했습니다.
여기서 dataTpe는 "json"이므로, API를 호출하는 동안 data/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);
}
});
OR,
$.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);
}
});
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 + '"'
}
언급URL : https://stackoverflow.com/questions/2445874/invalid-json-primitive-in-ajax-processing
'programing' 카테고리의 다른 글
새 DB가 훨씬 느림 (0) | 2023.09.01 |
---|---|
스크롤로 AJAX 기능이 작동하지 않습니다. (0) | 2023.09.01 |
IIS URL 다시 쓰기 vs URL 라우팅 (0) | 2023.09.01 |
괄호 안의 숫자는 정말 무엇을 의미합니까? (0) | 2023.09.01 |
클릭하면 브라우저에서 이미지 파일 다운로드 (0) | 2023.08.27 |