Asp.net VB.net反序列化,JSON从类型转换为';字典(字符串、对象)和#x27;输入';字符串';

Asp.net VB.net反序列化,JSON从类型转换为';字典(字符串、对象)和#x27;输入';字符串';,asp.net,json,vb.net,web-services,serialization,Asp.net,Json,Vb.net,Web Services,Serialization,所以我看过很多文章,但我仍然在努力将这个JSON对象序列化到类中。JSON结构如下所示 {“value”:{“HashTag”:“12342345636”,“companyname”:“我的测试公司”,“LeadDetail”:{“id”:“1”,“firstname”:“john”,“lastname”:“clark”,“email”:emak@mai.com“,“电话”:“9874534444”}}} 我的班级结构如下: <Serializable> _ Public Clas

所以我看过很多文章,但我仍然在努力将这个JSON对象序列化到类中。JSON结构如下所示

{“value”:{“HashTag”:“12342345636”,“companyname”:“我的测试公司”,“LeadDetail”:{“id”:“1”,“firstname”:“john”,“lastname”:“clark”,“email”:emak@mai.com“,“电话”:“9874534444”}}}

我的班级结构如下:

 <Serializable> _
Public Class LeadDetailCall
    Public Property Hash() As String
        Get
            Return m_Hash
        End Get
        Set(value As String)
            m_Hash = value
        End Set
    End Property

    Private m_Hash As String = ""
    Public Property CompanyName() As String
        Get
            Return _CompanyName
        End Get
        Set(value As String)
            _CompanyName = value
        End Set
    End Property
    Private _CompanyName As String = ""

    Public Property Details() As List(Of LeadDetail)
        Get
            Return _Details
        End Get
        Set(ByVal value As List(Of LeadDetail))
            _Details = value
        End Set
    End Property
    Private _Details As List(Of LeadDetail)
End Class
<Serializable> _
Public Class LeadDetail
    Private _id As String = ""
    Private _firstname As String = ""
    Private _lastname As String = ""
    Private _email As String = ""
    Private _phone As String = ""
    Public Property id() As String
        Get
            Return _id
        End Get
        Set(value As String)
            _id = value
        End Set
    End Property

    Public Property firstname() As String
        Get
            Return _firstname
        End Get
        Set(ByVal value As String)
            _firstname = value
        End Set
    End Property
    Public Property lastname() As String
        Get
            Return _lastname
        End Get
        Set(ByVal value As String)
            _lastname = value
        End Set
    End Property
    Public Property email() As String
        Get
            Return _email
        End Get
        Set(ByVal value As String)
            _email = value
        End Set
    End Property
    Public Property phone() As String
        Get
            Return _phone
        End Get
        Set(ByVal value As String)
            _phone = value
        End Set
    End Property
End Class

如果有人能帮助我,我将非常感激:)

您的类似乎与Json不正确对应

使用,它建议您的类应如下所示:

Public Class LeadDetail
    Public Property id As String
    Public Property firstname As String
    Public Property lastname As String
    Public Property email As String
    Public Property phone As String
End Class

Public Class Value
    Public Property HashTag As String
    Public Property companyname As String
    Public Property LeadDetail As LeadDetail
End Class

Public Class LeadDetailCall
    Public Property value As Value
End Class

提供的JSON只有一个元素,因此它将生成一个元素的集合(字典)。我添加了一个“项目”,以确保下面的代码正常工作,并用于说明。适当的缩进使事情更容易理解:

{
    "foo": {
        "HashTag": "12342345636",
        "companyname": "my test company",
        "LeadDetail": {
            "id": "1",
            "firstname": "ziggy",
            "lastname": "clark",
            "email": "emak@mai.com",
            "phone": "9874534444"
        }
    },
    "bar": {
        "HashTag": "02342345636",
        "companyname": "my test company2",
        "LeadDetail": {
            "id": "1",
            "firstname": "john",
            "lastname": "clark",
            "email": "emak@mai.com",
            "phone": "1874534444"
        }
    }
}
从缩进最深的开始,很容易看到一个
LeadDetail
类,带有{ID,FirstName等)。对于多个项(如我的),这将重复

还有“foo”和“bar”对象,其中包含少量数据和一个
LeadDetail
对象。当您使用任何一个机器人时,它们都会为每个机器人创建一个类。我的机器人将命名为“foo”和“bar”,但在其他方面是相同的。在下面的代码中,我将其压缩为一个名为“Item”的类。然后您可以处理它们(foo和bar)作为
字典(字符串、项)
,它们的名称是键

但是还有一个不太明显的类/类型:最外层的
{..}
。robot工具将创建一个名为“Example”或“RootObject”的类。您不需要它,也不希望它作为字典:

' modified from VS's EDIT -> Paste Special -> JSON as Classes
Public Class Item           
    Public Property HashTag As String
    Public Property companyname As String
    Public Property LeadDetail As Leaddetail
End Class

Public Class Leaddetail
    Public Property id As String
    Public Property firstname As String
    Public Property lastname As String
    Public Property email As String
    Public Property phone As String
End Class
然后代码:

Dim jstr As String = ...
' use the Item/Value class not the container
Dim myJ = JsonConvert.DeserializeObject(Of Dictionary(Of String, Item))(jstr)

' print some of the data
For Each kvp As KeyValuePair(Of String, Item) In myJ
    Console.WriteLine("key {0}, CompName {1}, Contact: {2}", kvp.Key,
                      kvp.Value.companyname,
                      kvp.Value.LeadDetail.firstname)
Next
输出:

关键字:foo,公司名称:我的测试公司,联系人:ziggy
钥匙:酒吧,公司名称:我的测试公司2,联系人:约翰


如果您在原始JSON上运行它,您会得到一个字典。

@Keith Beard在这个问题中说过,需要序列化,然后反序列化到类中。我从ajax jquery调用webmethod

<System.Web.Services.WebMethod()>
Public Shared Function InsertObject (data As Object) As Boolean

    Try
        Dim jstr = JsonConvert.SerializeObject(data)
        Dim _invoice = JsonConvert.DeserializeObject(Of DtoInvoice)(jstr)

        'Make another stuff here

        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

作为布尔值的公共共享函数InsertObject(数据作为对象)
尝试
Dim jstr=JsonConvert.SerializeObject(数据)
Dim _invoice=JsonConvert.DeserializeObject(属于DtoInvoice)(jstr)
“在这里再做一件东西
返回真值
特例
返回错误
结束尝试
端函数

仍然得到无效的强制转换异常,@kcbeard当时不知道。我建议不要从上面的嵌套Json开始,而是从一些非常基本的东西开始,比如
{“value”:“test”}
然后看看你是否可以让它工作,如果可以的话,让json一次复杂一点。我必须将它序列化为一个字符串,然后将字符串反序列化到我的对象以使其工作。你的类暗示你期望或希望在json中允许一个集合,但这不是它的构造方式。如果是这样,你能发布一个sa吗有多个条目(或链接)的示例令人惊叹:)因为我现在确实理解了异常错误有时当你在森林中迷路时,很难看到树;)@puropoix:在中面临同样的问题,但无法解决。请你看一下。
Dim jstr As String = ...
' use the Item/Value class not the container
Dim myJ = JsonConvert.DeserializeObject(Of Dictionary(Of String, Item))(jstr)

' print some of the data
For Each kvp As KeyValuePair(Of String, Item) In myJ
    Console.WriteLine("key {0}, CompName {1}, Contact: {2}", kvp.Key,
                      kvp.Value.companyname,
                      kvp.Value.LeadDetail.firstname)
Next
<System.Web.Services.WebMethod()>
Public Shared Function InsertObject (data As Object) As Boolean

    Try
        Dim jstr = JsonConvert.SerializeObject(data)
        Dim _invoice = JsonConvert.DeserializeObject(Of DtoInvoice)(jstr)

        'Make another stuff here

        Return True
    Catch ex As Exception
        Return False
    End Try
End Function