在构造函数中将Json反序列化为Object

时间:2016-05-27 07:44:33

标签: .net json vb.net serialization

我有一个表示实体的Object,我希望有一个带有JSON字符串的构造函数作为表示Object的参数,而不是要使用JsonUtils(或其他)进行desearialize。 例如:

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

当然我不能设置我,因为编译器会抛出一个错误“'我'没有puede ser el destino deunaasignación”(“'我'不能成为任务的目标”,对不起但是我的VS2005在西班牙语)。

我怎样才能做到这一点? 这种方法是正确的吗?

环境:Visual Studio 2005,.net Framework 2.0(无法更新)

2 个答案:

答案 0 :(得分:1)

您不能直接设置Me,但可以使用反射来访问每个属性并从json对象更新每个属性。例如:

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

这至少应该让你失望。如果要排除某些属性,可以执行各种错误检查并设置绑定标志。

答案 1 :(得分:1)

最简单的事情就是让序列化程序创建新对象:

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

要在类中保留反序列化代码,可以使用共享方法创建新对象:

Public Shared Function FromJson(ByVal sJson As String) As Person
    Dim serializer As New Serialization.JavaScriptSerializer
    Return serializer.Deserialize(Of Person)(sJson)
End Function

用法:

Dim p As Person = Person.FromJson(sJson)

与自反序列化的语法没有什么不同:

Dim p As Person = New Person(sJson)

最后,您可以将每个属性从反序列化的临时变量复制到Me.Age等。但无论是属性还是反射属性,对于您所描述的内容,这似乎都是不必要的复杂。