Ajax 처리의 "잘못된 JSON 기본 요소"


101

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

내가 이해하지 못하는 것은. 자바 스크립트는 AddAlbumToMyProfile에 관한 것이고 WebMethod는 DeleteRecord라고합니다. 올바른 코드 조각을 보여 주시겠습니까?
지터

POST가 어떻게 보이는지 (방화범 또는 기타 사용) 캡처하여 질문에 추가 할 수도 있습니까? 전송하기 전에 데이터를 인코딩하는 방식인지 확실하지 않지만 this ( json.org/json2.js )를 사용하여 직렬화 할 수도 있습니다 .
R0MANARMY

답변:


135

변수에 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는 데이터를 그대로두고 ASP.NET이 json 서버 측을 구문 분석 할 수 있도록 서버에 문자열을 그대로 보내야합니다.


5
설명을 해주셔서 감사합니다. 댓글을 하나 더 추가하세요. 더 쉬운 삶을 위해 항상 JSON.stringify ({foo : 'foovalue', bar : 'barvalue'})처럼 할 수 있습니다
Elaine

파티에 10 년 늦었지만 여전히 관련성이 있습니다. 이것은 유효한 JSON이 아닙니다. JSON의 문자열 (속성 이름 포함)은 큰 따옴표를 사용해야 하므로 {"foo": "foovalue", "bar": "barvalue"}. 작은 따옴표를 사용하는 것은 구문 오류입니다.
Mike 'Pomax'Kamermans

108

사용

data : JSON.stringify(obj)

위의 상황에서 효과가 있었을 것입니다.

참고 : 모든 브라우저가 해당 JSON 객체 (IE7-)를 지원하지 않는 json2.js 라이브러리를 추가해야합니다. json.js와 json2.js의 차이점


3
감사! 간단한 JS 클래스를 사용할 때 이것은 작동합니다. 나는 변화 data: { JSON.stringify(obj) }data: JSON.stringify(obj)(내 자바 스크립트 / 직렬화 JSON 클래스 스타일입니다 var myObj = { title: "x", subclass = someVar, ... } )
LKO

1
이것은 실제로 JSON을 전송해야하는 경우 제공되는 솔루션 입니다 (asp.net 웹 서비스를 사용할 수 있음 ). 다른 경우에는 제거하고contentType jQuery가 양식 인코딩 된 데이터를 전달하도록 하는 것이 더 쉬울 수 있습니다 .
GSerg

19

지터에서 언급했듯이이 $.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"
    ....
});

2
data호출 에서 매개 변수가 무시 된다는 점을 지적 해 주셔서 감사합니다 .
Noel Abrahams 2011 년

3
이것은 작동하지만 데이터 인코딩에 대한 요점 덕분에 자바 스크립트 클래스가 스타일이라면 나를 data: { JSON.stringify(obj) }위해 data: JSON.stringify(obj)일하도록 변경 했습니다 var myObj = { title: "x", subclass = someVar, ... } .
LKO

19

다음과 같이 작동합니다.

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

3
이 답변은 아마도 코드에 대한 설명을 제공하지 않았기 때문에 낮은 품질의 검토 대기열에 나타났습니다. 이 코드가 질문에 대한 답을 얻으면 답에 코드를 설명하는 텍스트를 추가해보세요. 이렇게하면 더 많은 찬성 투표를받을 가능성이 훨씬 더 높고 질문자가 새로운 것을 배울 수 있습니다.
lmo

두 개의 매개 변수를 전달하려고합니다 : 복잡한 객체의 배열과 정수. 나는 그것을한다 : data : {items : JSON.stringify (myarray), myId : value}.
A.Dara

답변을 게시 해 주셔서 감사합니다. 이것은 나를 위해 일했습니다.
ZMAX

13

Jquery Ajax는 기본적으로 다음과 같은 쿼리 문자열 매개 변수 형식으로 데이터를 보냅니다.

RecordId=456&UserId=123

processData옵션이 false로 설정되어 있지 않으면 서버에 개체로 전송됩니다.

  • contentType 옵션은 형식 클라이언트가 데이터를 보낸 서버용입니다.

  • dataType 옵션은 서버에서 어떤 유형의 데이터 클라이언트가 기대하고 있는지 알려주는 서버용입니다.

서버가 json이 아닌 쿼리 문자열 매개 변수로 구문 분석하도록 contentType을 지정하지 마십시오.

또는

contentType을 'application / json; charset = utf-8 '을 사용하고 JSON.stringify (object)를 사용하여 서버가 문자열에서 json을 역 직렬화 할 수 있도록합니다.


5

나는 @jitter가 그의 추측에 맞았지만 그의 솔루션은 나를 위해 작동하지 않았습니다.

작동 한 내용은 다음과 같습니다.

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

나는 시도하지 않았지만 매개 변수가 문자열이면 다음과 같아야한다고 생각합니다.

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

9
JSON 객체를 생성하기 위해 이와 같은 코드 (문자열 연결)를 작성해야한다면 자살 할 것입니다 (비상 적으로 말하면). 더 나은 방법이 있어야합니다.
PandaWood

3

나는 같은 문제에 직면하고 있었고, 좋은 해결책은 다음과 같습니다.

이 시도...

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

여기 문자열 유형 매개 변수에 대해 문자열 값으로 표시하기 위해 (\ ') 이스케이프 시퀀스 문자를 사용했습니다.


데이터 : "{Notes : \" "+ $ ( '# txtNotes'). val () +"\ "}
bestinamir

1

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

0

서버에서 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;
}

0

나는 같은 문제가 있었다. 팝업 창 닫기에서 상위 페이지 "저장"을 호출했습니다. ClientIDMode="Static"동일한 제어 ID로 부모 및 팝업 페이지에서 모두 사용 하고 있음을 발견했습니다 . ClientIDMode="Static"페이지 중 하나에서 제거 하여 문제가 해결되었습니다.


0

여기서 dataTpe는 "json"이므로 data / reqParam은 API를 호출하는 동안 문자열 형식이어야합니다. 원하는만큼 많은 개체가 있지만 결국 $ .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);
        }
    });

또는,

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

이 답변은 잘못된 매개 변수와 누락 된 매개 변수 사이에서 앞뒤로 튀었습니다.

이것은 나를 위해 일했습니다. 문자열 변수를 따옴표로 묶으십시오 ...

data: { RecordId: RecordId,
            UserId: UId,
            UserProfileId: UserProfileId,
            ItemType: '"' +  ItemType + '"',
            FileName: '"' +  XmlName + '"'
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.