ASP.Net webservices中的JSON数组类型解析

Max*_*ich 9 javascript vb.net asp.net jquery webservice-client

所以我已经研究了如何将我的自定义对象传递到ASP.Net json webservices.有魅力.

我遇到的问题是传递自定义对象的直接数组,或者传入作为自定义对象参数的数组.

所以例如......

Public Class WebService1
    Inherits System.Web.Services.WebService

    <WebMethod()> _
    <ScriptMethod(ResponseFormat:=ResponseFormat.Json)> _
    Public Function AddPersonList(ByVal PersonList As PersonList) As String
        Debug.Assert(False)
    End Function

    Public Class Person
        Public Sub New()
        End Sub

        Public Property FirstName As String
        Public Property LastName As String
    End Class

    Public Class PersonList
        Inherits List(Of Person)

    End Class
End Class

<script>
        $(function () {
            $.ajax({
                type: "POST",
                url: "WebService1.asmx/AddPersonList",
                data: " { PersonList: [ { FirstName: 'Max', LastName: 'Gershkovich' }, { FirstName: 'Test1', LastName: 'Test2' } ] }",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                success: function (e) { debugger; },
                error: function (e) { debugger; }
            });
        });
    </script>
Run Code Online (Sandbox Code Playgroud)

失败并出现错误:值"System.Collections.Generic.Dictionary`2 [System.String,System.Object] \"的类型不是"WebApplication1.WebService1 + Person \",不能在此通用集合中使用.\r \n参数名称:值

那么我该如何向ASP.net解释它实际上是一个Person数组呢?

请注意:将函数更改为List(of Person)或ArrayList确实有效,但鉴于我实现自己的自定义集合,这对我来说不是最佳选择.

更新:好的,我到目前为止所做的是这个问题肯定与JavascriptSerializer如何使用SimpleTypeResolver来解析类型有关.基本上如果我做这样的事情

Public Function AddPersonList(ByVal PersonList As String) As PersonList
Run Code Online (Sandbox Code Playgroud)

我可以使用以下代码重新创建错误.

Dim PersonList As PersonList = jsonSerializer.Deserialize(Of PersonList)(PList)
Run Code Online (Sandbox Code Playgroud)

但是,当我提供自己的自定义类型解析器时

Dim jsonSerializer As New JavaScriptSerializer(New MyCustomTypeResolver)
Run Code Online (Sandbox Code Playgroud)

我可以成功创建自定义列表的实例.

现在我已经研究了如何在web.config文件中提供我自己的自定义转换器.顺着这个......

<system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization>
          <converters>
            <add name="MyCustomConverter" type="WebApplication1.MyCustomConverter" />
          </converters>
        </jsonSerialization>
      </webServices>      
    </scripting>
  </system.web.extensions>
Run Code Online (Sandbox Code Playgroud)

但问题是我找不到指定CustomTypeResolver的方法.我的假设是,这是我所缺少的唯一一块拼图.

PSS:我曾尝试使用SimpleTypeResolver(SimpleTypeResolver MSDN)文档中指定的程序集完全限定名称,但这会抛出"由于对象的当前状态,操作无效".异常 - 这是TypeResolver无法解析名称时导致的错误(我通过使用CustomTypeResolver测试了解这一点)

更新@ Oleg和肖恩:

我真诚地感谢您的意见,并在实际上改变了我的申请,以反映您的建议; 已经说过这个改变的问题在于它需要以我希望避免的方式重新处理我的类实现及其相关行为.

我的问题从来没有传递到我的web服务列表(对象)(我只是提出了这样的问题,以简化stackoverflow).在这种情况下,我愿意完全接受使用Generic List(of)但我的问题实际上是我的一个自定义对象实现了一个具有强类型List(of)的属性,例如:

Customer {CustomerID AS Guid, FirstName AS String, LastName AS String, EmailAddresses AS EmailAddressList}
Run Code Online (Sandbox Code Playgroud)

现在需要改为

Customer {CustomerID AS Guid, FirstName AS String, LastName AS String, EmailAddresses AS List(Of EmailAddress)} 
Run Code Online (Sandbox Code Playgroud)

这无疑是世界末日,并且在Web服务上下文中可能更好(正如您所建议的那样)但在涉及我的Collection属性的内部应用程序使用时肯定是有害的.这意味着,一旦我拥有了这个属性,我每次要使用某些高级功能时都需要将它强制转换为CustomCollectionList,或者我需要实现另一个暴露CustomCollectionList的属性.任何一种解决方案都会在我嘴里留下令人讨厌的味道.

Ash*_*ish 0

您的数据似乎不符合 JSON 格式。请尝试使用

data: " { PersonList: [ { 'FirstName': 'Max', 'LastName': 'Gershkovich' }, { 'FirstName': 'Test1', 'LastName': 'Test2' } ] }"
Run Code Online (Sandbox Code Playgroud)

为了安全起见,请使用json库将数据转换为json。