【问题标题】:Deserialize Json to Object in a constructor在构造函数中将 Json 反序列化为 Object
【发布时间】:2016-09-25 10:51:23
【问题描述】:

我有一个表示实体的对象,我希望有一个带有 JSON 字符串作为参数的构造函数来表示该对象,而不是使用 JsonUtils(或其他)来反序列化。 示例:

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

我当然不能设置 Me,因为编译器会抛出错误“'Me' no puede ser el destino de una asignación”(“'Me' 不能成为赋值的目标”,对不起,但我的 VS2005 在西班牙语)。

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

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

【问题讨论】:

    标签: .net json vb.net serialization


    【解决方案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
    

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

    【讨论】:

    • "sourceObject" var 的目的是什么?只是初始化没有使用
    • 抱歉,我忘记更换了。我现在编辑它。我做了prop.GetValue(Me, Nothing) 因为我实际上并没有反序列化任何东西
    【解决方案2】:

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

     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)
    

    最后,您可以将每个属性从反序列化的 temp var 复制到 Me.Age 等。但是,无论是逐个属性还是通过反射,这对于您所描述的内容来说似乎是不必要的复杂。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-14
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2013-07-12
      相关资源
      最近更新 更多