【问题标题】:JSON Stringify Not Working on Array (ASP.NET)JSON Stringify 不适用于数组 (ASP.NET)
【发布时间】:2017-12-29 19:56:08
【问题描述】:

EDIT2:找到了解决办法,请看JSON, AJAX, and ASP.NET

问题最终是 ajax 调用中的参数未作为字符串发送到服务器端的 WebMethod。 ajax 调用的数据字段中的 JSON 字符串实际上是转换为 WebMethod 的参数中指定的对象类型。话虽如此,我的问题是数据没有作为字符串传递给 WebMethod,而是不同的对象类型。

编辑:查看 Chrome 中的浏览器控制台,我收到此错误:加载资源失败:服务器响应状态为 500(内部服务器错误)。深入挖掘,我有以下回应:

{"Message":"Type \u0027System.Collections.Generic.IDictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]\u0027 is not supported for deserialization of an array.","StackTrace":"   at System.Web.Script.Serialization.ObjectConverter.ConvertListToObject(IList list, Type type, JavaScriptSerializer serializer, Boolean throwOnError, IList\u0026 convertedList)\r\n   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeInternal(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n   at System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object\u0026 convertedObject)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)\r\n   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize[T](String input)\r\n   at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context, JavaScriptSerializer serializer)\r\n   at 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.InvalidOperationException"}

从未执行以下 ajax 调用,并且似乎 data 参数没有有效值。如果 data 设置为等于具有有效 JSON 的字符串文字,则没有问题。在 ajax 调用中将 javascript 对象转换为 data 的有效参数似乎存在问题。请在我的 aspx 文件中查看以下代码 sn-p:

<script type="text/javascript">
        $(document).ready((function () {
            $('#mytable tr').click(function (event) {
                var array = [];
                $(".tdval").each(function () { 
                    array.push({
                        value: $(this).html()
                    });
                });
                alert(JSON.stringify(array)); //produces what appears to be valid json after calling stringify: [{"value":"val1"},{"value":"val2"}]

                $.ajax({
                    type: "POST",
                    url: "schedule.aspx/GetCurrentTime",
                    data: JSON.stringify({ array }), //this seems to be the issue
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    success: function (response){
                        alert(response.d + "lol");
                    },
                    complete: function () {
                        alert("complete");
                    }
                });
            });
        }));
    </script>

这是 ajax 调用发布到的 C# 代码中的方法:

    [System.Web.Services.WebMethod]
    public static string GetCurrentTime(string name)
    {
        return "Hello ";
    }

有趣的是,我可以在 ajax 调用中将 data: JSON.stringify({ array }) 更改为字符串文字,它可以正常工作。但是在使用 stringify 时,来自 ajax 调用的“成功”回调方法永远不会执行。有什么想法吗?

【问题讨论】:

  • 为什么第二个 stringify 调用中有大括号?不要认为这些是必需的..
  • { array }{ array: array } 的 ES6 简写。因此 JSON 将在 JSON 对象的 "array" 属性中包含该数组。这是控制器所期望的吗?

标签: javascript jquery asp.net json ajax


【解决方案1】:

当您调用 JSON.stringify() 时,您在对象中拥有数组,因此您发送的 JSON 将如下所示:

{ array: [{"value":"val1"},{"value":"val2"}] }

而不是您之前在函数中提醒的内容。

改为使用:

data: JSON.stringify(array),

【讨论】:

  • 删除大括号后仍然无法正常工作。使用这些实际上是无意的,它是故障排除的残余物。我使用 JSONLint 来测试 JSON 是否有效,它说它是有效的。还有其他建议吗?
  • 您是否在控制台的“网络”选项卡中查看是否正在发送 AJAX 请求、参数是什么以及控制器的响应是什么?
  • 当我使用字符串文字 '{"name":"Bob"}' 时,代码有效。但是使用 [{"value":"val1"},{"value":"val2"}] 不起作用,尽管 JSONLint 说它是有效的 JSON。我更新了我的代码以显示此数据也传递到的 C# 代码隐藏方法,以便所有代码都可用。
  • 什么网络标签?在浏览器或视觉工作室?除了把参数放到调试控制台之外,我不熟悉监控参数是什么。
  • 我说的是浏览器控制台。任何从事浏览器应用程序的人都应该熟悉浏览器的开发者工具控制台。
猜你喜欢
  • 2014-03-23
  • 1970-01-01
  • 2018-06-22
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多