【问题标题】:VB.net deserialize, JSON Conversion from type 'Dictionary(Of String,Object)' to type 'String'VB.net 反序列化,从类型“字典(字符串,对象)”到类型“字符串”的 JSON 转换
【发布时间】:2015-07-03 03:33:04
【问题描述】:

所以我查看了很多帖子,但我仍在努力将这个 JSON 对象序列化为类。 JSON结构是这样的

{"value":{"HashTag":"12342345636","companyname":"my test company","LeadDetail":{"id":"1","firstname":"john","lastname":"clark","email":"emak@mai.com","phone":"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

我这样称呼:

    <WebMethod()> _
Public Function SendLeadDetails(ByVal value As Object) As UpdateResponse
    Dim CurCall As LeadDetailCall = JsonConvert.DeserializeObject(Of LeadDetailCall)(value)
End Function

我尝试了什么?使用 JavaScriptSerializer,使用http://jsontodatacontract.azurewebsites.net/ 抓取stackoverflow 为例。这么多的事情,我在这一点上很慌张。所以我不断收到以下无效转换异常错误。

 Conversion from type 'Dictionary(Of String,Object)' to type 'String' is not valid.

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

【问题讨论】:

  • 您的类暗示您期望或希望允许 JSON 中的集合,但这不是它的构造方式。如果是这样,您可以发布一个包含多个条目(或链接)的示例

标签: asp.net json vb.net web-services serialization


【解决方案1】:

您的课程似乎与您的 Json 不对应。

使用http://jsonutils.com/,它建议你的类应该是这样的:

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

【讨论】:

  • 仍然得到无效的强制转换异常,
  • @kcbeard 那时不知道。我建议不要从上面的嵌套 Json 开始,而是从非常基本的东西开始,比如{"value":"test"},看看你是否可以让它工作,如果可以,让 json 更复杂一点一次。
  • 我必须将其序列化为字符串,然后将字符串反序列化为我的对象才能使其工作
【解决方案2】:

提供的 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"
        }
    }
}

从最深的缩进开始,很容易看到带有 {ID, FirstName, etc) 的 LeadDetail 类。对于不止一项(如我的),这将重复。

然后是带有少量数据的“foo”和“bar”对象和一个LeadDetail 对象。当您使用任何机器人时,它们将为每个机器人创建一个类。我的将被命名为“foo”和“bar”,但在其他方面是相同的。在下面的代码中,我将其浓缩为一个名为“Item”的类。然后您可以将它们(Foo 和 Bar)视为 Dictionary(of String, Item),其中它们的名称是键。

但还有一个不太明显的类/类型:最外层的{..}。机器人工具将创建一个名为“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

输出:

key:foo,CompName:我的测试公司,联系人:ziggy
键:bar,CompName:我的测试公司2,联系人:john

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

【讨论】:

  • 太棒了:) 因为我现在真的明白那个异常错误了
  • 有时当你迷失在森林里时,很难看到树;)
  • @Plutonix:在this question 中面临同样的问题,但无法解决。你能看一下吗?
【解决方案3】:

@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

【讨论】:

    猜你喜欢
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多