2017-11-11 16 views
0

私は受信したjsonメッセージを逆シリアル化するためのラッパークラスを用意しています。 現時点で私はこれをこのように使用しています。vb.netそれ自身のクラスコンストラクタ

Dim oXMessage As XMessage = JsonConvert.DeserializeObject(Of XMessage)(message) 

私はもっときれいに、それをインスタンス化できるように、クラスのコンストラクタを作成したいです。このように

Dim oXMessage as XMessage = New XMessage(message)   

私は以下のコンストラクタを試しましたが、動作しません。 誰かが正しい方向に私を向けることができますか?

Public Class XMessage 
    <JsonProperty("e")> Public MessageType As String 
    <JsonProperty("data")> Public MessageData As Object 
    <JsonProperty("ok")> Public MessageOk As String 

    Public Sub New(message As String) 
     Me = JsonConvert.DeserializeObject(Of Me)(message) 
    End Sub 
End Class 
+1

[関連](訳:https://stackoverflow.com/questions/27511675/modify-existing-object-with-new-partial-json-data-using-json-net) – john

答えて

0

それは、現在構築中のオブジェクトであるので、あなたは、コンストラクタでMeを再割り当てすることはできません。

Public Class XMessage 
    <JsonProperty("e")> Public MessageType As String 
    <JsonProperty("data")> Public MessageData As Object 
    <JsonProperty("ok")> Public MessageOk As String 

    Public Sub New(message As String) 
     JsonConvert.PopulateObject(message, Me) 
    End Sub 

    Public Sub New() 
    End Sub 
End Class 

サンプルfiddle:しかし、あなたはその内容を初期化するためにJsonConvert.PopulateObject()を呼び出すことができます。

0

Meキーワードは、現在のインスタンスを参照し、割り当て対象にすることはできません。

代わりに、新しいオブジェクトを作成してデシリアライズし、新しいオブジェクトのメンバ変数を現在のインスタンスにコピーすることができます。

編集:ヘルパー関数なし

Public Class XMessage 

    <JsonProperty("e")> Public MessageType As String 
    <JsonProperty("data")> Public MessageData As Object 
    <JsonProperty("ok")> Public MessageOk As String 

    Public Sub New(message As String) 
     Dim other = JsonConvert.DeserializeObject(Of XMessage)(message) 
     Me.MessageType = other.MessageType 
     Me.MessageData = other.MessageData 
     Me.MessageOk = other.MessageOk 
    End Sub 

End Class 

オリジナル:

Public Class XMessage 

    <JsonProperty("e")> Public MessageType As String 
    <JsonProperty("data")> Public MessageData As Object 
    <JsonProperty("ok")> Public MessageOk As String 


    Public Sub New(message As String) 
     Dim other as XMessage= Deserialize(message) 
     Me.MessageType = other.MessageType 
     Me.MessageData = other.MessageData 
     Me.MessageOk = other.MessageOk 
    End Sub 


    Public shared Function Deserialize(message as String) as XMessage 
     return JsonConvert.DeserializeObject(Of XMessage)(message) 
    End Function 

    Public Shared Function Serialize(message As XMessage) As String 
     return JsonConvert.SerializeObject(message) 
    End Function 

End Class 
+0

私は賢明な構文別のインスタンスの作成を避けることができます。このソリューションは完璧に動作します - ありがとう。 –

+0

実際、今私はこれを正しくテストしています。このアプローチが無限の再帰を生成することがわかります。 –

+0

コードをそのままコピーする場合は、ここでは再帰はありません。 – Stokke

関連する問題