【问题标题】:Invalid JSON primitive: lookupID.","StackTrace":"无效的 JSON 原语:lookupID。","StackTrace":"
【发布时间】:2016-05-14 19:31:23
【问题描述】:

我无法弄清楚为什么会出现此错误。当我在变量周围加上引号时,它实际上是发送文本而不是变量。

{"Message":"无效的 JSON 基元:lookupID。","StackTrace":" 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer .DeserializeInternal(Int32 深度)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 深度)\r\n 在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 深度)\r\n在 System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(字符串输入,Int32 depthLimit,JavaScriptSerializer 序列化程序)\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer 序列化程序,字符串输入,类型类型,Int32 depthLimit )\r\n 在 System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](字符串输入)\r\n 在 System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext 上下文,JavaScriptSerializer 序列化程序)\r\ n在 System.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData, HttpContext context)\r\n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context, WebServiceMethodData methodData)","ExceptionType":"System .ArgumentException"}

我的ajax函数:

function GetVisitDates(lookupID, IsMiscellaneous) {
    $.ajax({
    type: "POST",
    url: "Home.aspx/GetVisitDates",
    data: "{ 'LookupID': lookupID, 'isMiscellaneous': IsMiscellaneous }",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: true,
...

它调用的方法:

[WebMethod]
    public static string GetVisitDates(int LookupID, bool isMiscellaneous)

【问题讨论】:

    标签: c# json ajax serialization webmethod


    【解决方案1】:

    您需要在发送数据之前先JSON.stringify() 数据 - 不幸的是.aspx WebMethods 对它们如何绑定参数非常挑剔:)

    如果您使用浏览器的 F12 工具查看实际的 POST 请求,您将看到您的代码当前发送的有效负载如下:

    LookupID=20&isMiscellaneous=true
    

    但是为了正确绑定,它需要是实际的 JSON,如下所示:

    {LookupID: 20, isMiscellaneous: true}
    

    这就是JSON.stringify 的用武之地。

    这是我用来复制并确认这解决了问题的代码:

    在 Home.aspx.cs 中:

    public partial class Home : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
    
        }
    
        [WebMethod]
        public static string GetVisitDates(int LookupID, bool isMiscellaneous)
        {
            return string.Format("{0}-{1}", LookupID, isMiscellaneous);
        }
    }
    

    在客户端(在我的例子中只是 Home.aspx 中的一个脚本):

     $(document).ready(function() {
                GetVisitDates(20, true);
            });
    
            function GetVisitDates(lookupID, isMiscellaneous) {
                var data = {
                    "LookupID": lookupID,
                    "isMiscellaneous": isMiscellaneous
                };
    
               data = JSON.stringify(data);
    
                $.ajax({
                        type: "POST",
                        url: "Home.aspx/GetVisitDates",
                        data: data,
                        contentType: "application/json; charset=utf-8",
                        dataType: "json",
                        async: true,
                        success: function(data) {
                            console.log(data);
                        },
                        error: function(xhr) {
                            console.log(xhr);
                        }
                    }
                );
            }
    

    最后,here 是一个非常适合将 ajax 与 Webforms 结合使用的参考...希望对您有所帮助!

    【讨论】:

    • 这行得通!谢谢!我没有在asp`[ScriptMethod()]`中使用这一行,没有它似乎也可以工作。现在我在查看返回值时遇到 jquery 错误。
    • @Mr.Robot - 哦,ScriptMethod 是个错误,它不是必需的,将删除。如果您在返回数据方面遇到问题,只需发布​​另一个问题,我相信您会得到一个很好的答案:)
    • 我自己想通了,我意识到我没有正确使用 $.each()。
    【解决方案2】:

    我相信引号会把它扔掉。

    我会先将 JSON 放入它自己的变量中:

    function GetVisitDates(lookupID, IsMiscellaneous) {
    var data = {
       "LookupID" : lookupID,
       "isMiscellaneous" : isMiscellaneous
    };
    
    $.ajax({
    type: "POST",
    url: "Home.aspx/GetVisitDates",
    data: JSON.stringify(data),
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    async: true,
    ...
    

    或者,这可能会起作用,但我并不完全确定:

    data: { 'LookupID': lookupID, 'isMiscellaneous': IsMiscellaneous },
    

    编辑:Steven Bryne 是正确答案。您想添加 JSON.stringify()。 我也更新了我的答案。

    另见:Invalid JSON primitive ERROR

    【讨论】:

    • 我试过这个,但我仍然得到错误.... {"Message":"Invalid JSON primitive: LookupID.","StackTrace":" ...
    • 你可以试试这个:data: JSON.stringify(data),
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2020-07-31
    • 2014-04-17
    相关资源
    最近更新 更多