我有一个vb.net类,其中包含一些可序列化的子类
Public Class Model
Public class foo
Public Property id as Integer
Public Property name as String
End Class
Public Class bar
Public Property grading as Integer
Public Property minWage as Decimal
Public Property maxWage as Decimal
End Class
End Class
现在我从web服务接收一个对象( json格式的字符串)和它的类名(字符串),我想把它反序列化为我的对象。
我可以这样做,因为它实际上是有效的,一个
Imports Newtonsoft.Json
Public Shared Function Deserialize(ByVal Json As String, ByVal name As String) As Object
Select Case name
Case "foo"
Return JsonConvert.DeserializeObject(of Model.foo)(Json)
Case "bar"
Return JsonConvert.DeserializeObject(of Model.bar)(Json)
End Select
End Function
但是您可以想象,我有很多类,而不仅仅是2个,所以我尝试使用反射
Imports System.Reflection
Imports Newtonsoft.Json
Public Shared Function Deserialize(ByVal Json As String, ByVal name As String) As Object
Dim assembly As Assembly = Assembly.GetAssembly(GetType(Model))
Dim type As Type = assembly.[GetType]("Model." & name) ' Why is this always Nothing?
Dim objInstance As Object = Activator.CreateInstance(type)
' objInstance = JsonConvert.DeserializeObject(Of ???)(Json)
Return objInstance
End Function
但是一方面类型变量总是Nothing,另一方面,我不知道用什么代替注释。
你能给点建议吗?
发布于 2021-02-25 20:22:45
您需要添加Namespace,其中Model
类已定义。
嵌套类由+
,因此您必须将其添加到要创建的Class对象的全名中。然后将组成的字符串"[Namespace].[ClassName]+[NestedClassName]"
您不需要创建实例,Json序列化程序将为您创建实例。将类的类型传递给JsonConvert.DeserializeObject()
方法,该方法接受Type作为第二个参数。
Public Shared Function Deserialize(Json As String, className As String) As Object
Dim asm = Assembly.GetAssembly(GetType(Model))
Dim t As Type = asm.GetType($"{asm.GetName().Name}.Model+{className}")
Return JsonConvert.DeserializeObject(Json, t)
End Function
您将如何使用它,这取决于您:)
更多通用
Public Shared Function Deserialize(Of T)(Json As String, className As String) As Object
Dim asm = Assembly.GetAssembly(GetType(T))
Dim t1 As Type = asm.GetType($"{asm.GetName().Name}.{GetType(T).Name}+{className}")
Return JsonConvert.DeserializeObject(Json, t1)
End Function
调用方式:
Dim deserialized = Deserialize(Of Model)(Json, "foo")
https://stackoverflow.com/questions/66366603
复制相似问题