首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JsonConvert.DeserializeObject知道类名(字符串)

JsonConvert.DeserializeObject知道类名(字符串)
EN

Stack Overflow用户
提问于 2021-02-25 18:17:12
回答 3查看 88关注 0票数 1

我有一个vb.net类,其中包含一些可序列化的子类

代码语言:javascript
复制
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格式的字符串)和它的类名(字符串),我想把它反序列化为我的对象。

我可以这样做,因为它实际上是有效的,一个

代码语言:javascript
复制
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个,所以我尝试使用反射

代码语言:javascript
复制
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,另一方面,我不知道用什么代替注释。

你能给点建议吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-25 20:22:45

您需要添加Namespace,其中Model类已定义。

嵌套类由+,因此您必须将其添加到要创建的Class对象的全名中。然后将组成的字符串"[Namespace].[ClassName]+[NestedClassName]"您不需要创建实例,Json序列化程序将为您创建实例。将类的类型传递给JsonConvert.DeserializeObject()方法,该方法接受Type作为第二个参数。

代码语言:javascript
复制
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

您将如何使用它,这取决于您:)

更多通用

代码语言:javascript
复制
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

调用方式:

代码语言:js
复制
Dim deserialized = Deserialize(Of Model)(Json, "foo")
票数 0
EN

Stack Overflow用户

发布于 2021-02-25 20:23:42

我已经部分解决了我的问题,我现在可以创建正确的对象,如下所示

代码语言:javascript
复制
Dim objType As Type = (From asm In AppDomain.CurrentDomain.GetAssemblies() From type In asm.GetTypes() Where type.IsClass AndAlso type.Name = name Select type).Single()
Dim objInstance As Object = Activator.CreateInstance(objType)
票数 0
EN

Stack Overflow用户

发布于 2021-02-25 20:30:56

这是我最后的工作函数,多亏了Jimi!

代码语言:javascript
复制
Public Shared Function Deserialize(ByVal Json As String, ByVal name As String) As Object
    Try
        Dim objType As Type = (From asm In AppDomain.CurrentDomain.GetAssemblies() From type In asm.GetTypes() Where type.IsClass AndAlso type.Name = name Select type).Single()

        Return JsonConvert.DeserializeObject(Json, objtype)

    Catch ex As Exception
        Throw New Exception("Unknown class")
    End Try
End Function
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66366603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档