Разрешение типа массива JSON в веб-сервисах ASP.Net

Итак, я разработал, как передать свои пользовательские объекты в веб-службы ASP.Net json. Работает шарм.

Проблема, с которой я сталкиваюсь, заключается в передаче прямых массивов моих настраиваемых объектов или, альтернативно, при передаче массивов, которые являются параметрами моих настраиваемых объектов.

Так, например ...

Public Class WebService1
    Inherits System.Web.Services.WebService

     _
     _
    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


Сбой с ошибкой: значение \ "System.Collections.Generic.Dictionary`2 [System.String, System.Object] \" не относится к типу \ "WebApplication1.WebService1 + Лицо \ "и не может использоваться в этой общей коллекции. \ r \ nParameter name: value

Итак, как мне объяснить ASP.net, что это фактически массив Person?

Обратите внимание: изменение функции на List (of Person) или ArrayList работает, но учитывая, что я реализую свои собственные коллекции, это не оптимально для меня.

ОБНОВЛЕНИЕ: Хорошо, так что до сих пор я решил, что эта проблема определенно связана с тем, как JavascriptSerializer использует SimpleTypeResolver для определения типов. Обычно, если я делаю что-то подобное

Public Function AddPersonList(ByVal PersonList As String) As PersonList

, я могу воссоздать ошибку, используя следующий код.

Dim PersonList As PersonList = jsonSerializer.Deserialize(Of PersonList)(PList)

Однако, когда я предоставляю свой собственный преобразователь типов в соответствии со строками

Dim jsonSerializer As New JavaScriptSerializer(New MyCustomTypeResolver)

, я могу успешно создать экземпляр своего настраиваемого списка.

Теперь я разработал, как предоставить свой собственный конвертер в файле web.config. В соответствии с этим….


    
      
        
          
            
          
        
            
    
  

Но проблема в том, что я не могу найти способ указать CustomTypeResolver. Я предполагаю, что это единственный кусок головоломки, который мне не хватает.

PSS: Я попытался использовать полное имя сборки, как указано в документации для SimpleTypeResolver ( SimpleTypeResolver MSDN ), но это вызывает ошибку «Операция недействительна из-за текущего состояния объекта». исключение - ошибка, вызванная тем, что TypeResolver не может разрешить имя (я знаю это по тестированию с помощью моего CustomTypeResolver)

ОБНОВЛЕНИЕ @ Олег и Шон:

Я искренне признателен за ваш вклад и фактически изменил свое приложение, чтобы отразить ваш предложения; сказав, что проблема с этим изменением заключается в том, что оно требует переделки реализации моего класса и связанного с ним поведения способами, которых я бы предпочел избежать.

Моя проблема никогда не заключалась в передаче списка (объектов) в мой веб-сервис (я просто поставил вопрос как таковой, чтобы упростить его для stackoverflow). В таком случае я был бы готов полностью согласиться с использованием Generic List (of), но моя проблема заключалась в том, что один из моих настраиваемых объектов реализовал свойство со строго типизированным List (of), например:

Customer {CustomerID AS Guid, FirstName AS String, LastName AS String, EmailAddresses AS EmailAddressList}

который теперь требует должен быть изменен на

Customer {CustomerID AS Guid, FirstName AS String, LastName AS String, EmailAddresses AS List(Of EmailAddress)} 

Это, по общему признанию, не конец света и, вероятно, лучше в контексте веб-сервиса (как вы предположили), но определенно вред, когда дело доходит до использования внутренних приложений моих свойств Collection. Это означает, что если у меня есть это свойство, мне нужно либо передавать его в свой CustomCollectionList каждый раз, когда я хочу использовать какую-либо расширенную функцию, либо мне нужно реализовать другое свойство, которое предоставляет CustomCollectionList. Любой из этих растворов оставляет неприятный привкус во рту.

9
задан Maxim Gershkovich 10 January 2011 в 06:12
поделиться