2016-05-27 11 views
1

オブジェクトを表すObjectがあります.JsonUtils(または何か)を使用せずにObjectを表すパラメータとしてJSON文字列を使用してコンストラクタを作成したいと考えています。 例:コンパイラはエラーをスローしますので、私は(「『私』は割り当ての対象にならない」「『私』はpuedeのSERエルDESTINO・デ・ウナasignación」ミーを設定することはできませんもちろんコンストラクタ内のオブジェクトにJsonをデシリアライズする

Imports System.Web.Script 

Public Class Person 

Public Property Age As Integer 
Public Property Children As Integer 
Public Property Married As Boolean 

Public Sub New() 
End Sub 

Public Sub New(ByVal sJson as String) 
     Dim serializer As New Serialization.JavaScriptSerializer 
     Me = serializer.Deserialize(Of Person)(sJson) 
End Sub 

End Class 

、申し訳ありませんが、私のVS2005はスペイン語です)。

どうすればこの問題を解決できますか? このアプローチは正しい方法ですか?

的環境:Visual Studio 2005の、.NET Framework 2.0の(更新することはできません)

答えて

1

最も簡単な方法は、シリアライザは、新しいオブジェクトを作成できるようにするだけである:

Public Shared Function FromJson(ByVal sJson As String) As Person 
    Dim serializer As New Serialization.JavaScriptSerializer 
    Return serializer.Deserialize(Of Person)(sJson) 
End Function 
:クラスでdeserializtionコードを保つために

Dim p As Person = serializer.Deserialize(Of Person)(sJson) 

を、あなたは新しいオブジェクトを作成するために、共有メソッドを使用することができます

使用法:

Dim p As Person = Person.FromJson(sJson) 

それはすべて自己DESの構文と大差ありませんerialization:

Dim p As Person = New Person(sJson) 

最後に、あなたがMe.Ageなどにしかし、プロパティかどうかをプロパティまたは反射スルー非直列化された一時VARから各プロパティをコピーすることができ、これはあなたが記述何のために不必要に複雑なようです。

1

あなたが直接Meを設定することはできませんが、すべてのプロパティにアクセスし、JSONオブジェクトから各1を更新するためにリフレクションを使用することができます。例:

Public Sub New(ByVal sJson as String)  
    Dim sourceObject = serializer.Deserialize(Of Person)(sJson) 
    For Each prop As PropertyInfo In Me.GetType().GetProperties() 
     prop.SetValue(Me, prop.GetValue(sourceObject, Nothing), Nothing) 
    Next 
End Sub 

これは少なくとも開始する必要があります。いくつかのプロパティを除外したい場合は、さまざまなエラーチェックやバインディングフラグの設定ができます。

+0

"sourceObject" varの目的は何ですか?初期化されていますが使用されていません – Oliver

+0

ああ申し訳ありません、私はそれを置き忘れました。私は今それを編集します。私は 'prop.GetValue(私、何もない)'をしました。なぜなら、私は実際に何かをデシリアライズしなかったからです –

関連する問題