programing

Ajax 처리에 "잘못된 JSON 기본값"이(가) 있습니다.

megabox 2023. 9. 1. 20:42
반응형

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

반응형