【问题标题】:JSON Deserialization in .NET service - can't solve this issue.NET 服务中的 JSON 反序列化 - 无法解决此问题
【发布时间】:2015-02-24 21:09:17
【问题描述】:

我在这个问题上花了几天时间都无济于事。我只需要在 VB.NET 中反序列化一个 JSON 对象,但不断收到此错误:

“数组的反序列化不支持类型'System.String'。”

我已经使用了我发现的所有建议来尝试解决这个问题,但没有一个奏效。

这是我的 JQuery 代码:

          $.ajax({
                type: "POST",
                url: "/Services/Data_Services.asmx/AssignRoles",
                contentType: "application/json; charset=utf-8",
                data: JSON.stringify({ roleAssignments: roleassignments }),
                datatype: "json",
                success: function (data) {
                    alert("Group assignments successfully set");
                },
                error: function (response) {
                    alert(response.responseText);
                },
                failure: function (response) {
                    alert(response.responseText);
                }
            });

这输出: {"roleAssignments":[{"groupid":"2","role":"4","staffid":"111"},{"groupid":"2","role":"5"," staffid":"999"},{"groupid":"2","role":"6","staffid":"999"},{"groupid":"2","role":"7" ,"staffid":"0"},{"groupid":"2","role":"8","staffid":"999"},{"groupid":"2","role":" 9","staffid":"15"}]}

(JSON 有效。我在 JSONLint 中检查过)

这是在反序列化函数中返回错误的 .NET 代码:

Public Function AssignRoles(ByVal roleAssignments As String) As String()
[.........] 

Dim aRoleList As New List(Of roleAssignments)
Dim js As New System.Web.Script.Serialization.JavaScriptSerializer
aRoleList = js.Deserialize(Of List(Of roleAssignments))(roleAssignments)

[.........]
End Function

Public Class roleAssignments
   Public Property groupid As String
   Public Property role As String
   Public Property staffid As String
End Class

有什么想法可以解决这个问题吗?我完全被难住了,通过阅读其他示例,我似乎遵循了正确的语法,但无法理解问题所在。

谢谢。

【问题讨论】:

    标签: javascript asp.net json vb.net deserialization


    【解决方案1】:

    我自己设法解决了这个问题。原来 List 对象不是问题。这是我将 JSON 传递到 Web 服务的方式。我不得不转义引号并更改 JSON.stringify 语法。传递给另一个 JSON.stringify 的 JSON.stringify 为引号添加了转义。

    $.ajax({
                    type: "POST",
                    url: "/Services/Data_Services.asmx/AssignRoles",
                    data: "{ \"roleJSON\": " + JSON.stringify(JSON.stringify(roleassignments)) + "}",
                    dataType: "json",
                    contentType: "application/json; charset=utf-8",
                    success: function (data) {
                            // parse return data here....
                            showSuccessMessage("Group assignments set");
                    },
                    error: function (response) {
                        alert("Error occurred:" + response.responseText);
                    },
                    failure: function (response) {
                        alert("Insert failed: " + response.responseText);
                    }
                });
    

    除了从 List 声明中删除 new 关键字并更改传入的 JSON 字符串的名称之外,我只保留了 VB 代码。

     Dim aRoleList As List(Of roleAssignments)
     Dim returnedValue As New List(Of String)
     Try
         Dim js As New System.Web.Script.Serialization.JavaScriptSerializer
         aRoleList = js.Deserialize(Of List(Of roleAssignments))(roleJSON)
    [.....]
    

    我想发布解决方案,以便可能遇到相同问题的任何其他人都可以解决。与开发一样,语法通常是罪魁祸首。

    【讨论】:

    • JSON 请求在发送时将如下所示: { "roleJSON": "[{\"groupid\":\"1\",\"role\":\"4\",\ "职员\":\"515\"},{\"groupid\":\"1\",\"角色\":\"5\",\"职员\":\"489\"}, {\"groupid\":\"1\",\"角色\":\"6\",\"staffid\":\"464\"},{\"groupid\":\"1\" ,\"role\":\"7\",\"staffid\":\"126\"},{\"groupid\":\"1\",\"role\":\"8\" ,\"staffid\":\"306\"},{\"groupid\":\"1\",\"role\":\"9\",\"staffid\":\"15\" }]"}
    • 我很高兴您解决了您的问题,但这实际上并没有回答原始问题。在某个审阅队列中阅读它的其他人很可能会 DV 它。我发布的答案很好(see this Fiddle)。此外,您的新 JSON 无法通过 JSONLint。
    • 同意此处显示的 JSON 不会传入 JSONLint,但显然我将代码传递到的 VB 对象需要转义引号以正确理解字符串并对其进行反序列化。
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2022-01-17
    • 2018-04-02
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多