2011-01-06 13 views
9

私はカスタムオブジェクトをASP.Net json webservicesに渡す方法を研究しました。魅力を発揮します。ASP.Net WebサービスのJSON配列型解決

問題カスタムオブジェクトの直線配列を渡すか、またはカスタムオブジェクトのパラメータである配列を渡しています。

だからたとえば...

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> 

はエラーで失敗:\値 "System.Collections.Generic.Dictionary`2 [可能System.String、System.Objectの]を\" タイプではない\ "WebApplication1.WebService1 + Person \"であり、この汎用コレクションでは使用できません。パラメータ名:値

ASP.netにはPersonの配列であることをどのように説明しますか?

注意:関数をList(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ファイルで提供する方法を研究しました。これに沿って...。

<system.web.extensions> 
    <scripting> 
     <webServices> 
     <jsonSerialization> 
      <converters> 
      <add name="MyCustomConverter" type="WebApplication1.MyCustomConverter" /> 
      </converters> 
     </jsonSerialization> 
     </webServices>  
    </scripting> 
    </system.web.extensions> 

しかし、問題は、私はCustomTypeResolverを指定する方法を見つけることができないということです。私の前提は、これが私が紛失しているパズルの唯一の作品だということです。

PSS:私は(SimpleTypeResolver MSDN)SimpleTypeResolverためのドキュメントで指定されたアセンブリに完全修飾名を使用しようとしましたが、これはスロー「操作が原因オブジェクトの現在の状態に有効ではありません。」私は心からあなたの入力を感謝し、Infactは変更されている

: - 例外TypeResolverが名前を解決できないときにエラーが発生しているオレグとショーン@

UPDATEを(私は私のCustomTypeResolverでテストすることによって、これを知っています)あなたの提案を反映する私のアプリケーション。この変更に伴う問題は、クラスの実装とその関連する動作を、私が避けたがっている方法で再加工する必要があるということでした。

私の問題は、リスト(オブジェクト)をWebサービスに渡すことはありませんでした(私は単に、stackoverflowのために単純化するために質問を提出しました)。このような場合、私は完全に(の)一般的なリストを使用して受け入れることをいとわないだろうが、私の問題は私のカスタムオブジェクトの一つが(の)強力な型指定されたリストでプロパティを実装することを実際にだっ例えばので:

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)} 

それは内部のアプリケーションの使用に来るとき、これは間違いなく不利益確かに世界の終わりではなく、(あなたが示唆したように)Webサービスのコンテキストで、おそらくより良いですが、に変更する必要があり

私のコレクションプロパティ。これは、いったんこのプロパティを取得すると、高度な機能を使用するたびにCustomCollectionListにキャストするか、CustomCollectionListを公開する別のプロパティを実装する必要があることを意味します。どちらの解決策が私の口に不快な味を残す。

+0

私の知る限り、これはJSON用.NETでのシリアライゼーションメカニズムの制限です。私はまだこの機能の例を見ておらず、自分でそれを動作させることができませんでした。 upvoteの後にちょうど質問を再読 –

答えて

関連する問題