在VB.NET中反序列化JSON数据的问题

时间:2012-02-03 17:13:02

标签: vb.net json json.net deserialization

我试图使用Visual Basic中的JSON.NET库将简单的JSON数组反序列化为.NET对象。

对于我的生活,我无法弄清楚我在这里做错了什么。我的JSON字符串反序列化为适当的对象(总共9个),但没有填充任何属性。

我的代码:

Public Class result

  Public Property id As Integer

  Public Property vote_percentage As String

  Public Sub New()

  End Sub

  Public Sub New(ByVal id As Integer, ByVal vote_percentage As String)
    Me.id = id
    Me.vote_percentage = vote_percentage
  End Sub

End Class

我试图反序列化的JSON数据如下所示:

  

[{ “决赛”:{ “ID”:12, “vote_percentage”: “28”}},{ “决赛”:{ “ID”:13, “vote_percentage”: “6”}},{”决赛 “:{” ID “:14,” vote_percentage “:” 4 “}},{” 决赛 “:{” ID “:15,” vote_percentage “:” 3 “}},{” 决赛 “:{” ID “:16,” vote_percentage “:” 7 “}},{” 决赛 “:{” ID “:17,” vote_percentage “:” 1 “}},{” 决赛 “:{” ID “:18,” vote_percentage “:” 47 “}},{” 决赛 “:{” ID “:19,” vote_percentage “:” 2 “}},{” 决赛 “:{” ID “:20,” vote_percentage “:” 1" } }]

最后我的反序列化:

Dim Results As New List(Of result)

Results = JsonConvert.DeserializeObject(Of List(Of result))(_result)

结果是9个没有分配任何属性值的对象。

我正在绞尽脑汁,所以如果有人能给我一块骨头,我会很感激。

感谢。

更新:

所以这是我做出的改变让它发挥作用:

  1. 修改了我的结果类,以包含类型为finalist
  2. 的属性决赛入围者
  3. 创建了一个具有属性id和vote_percentage

    的新类决赛入围者
    Public Class finalist
    
        Public Property id As Integer
    
        Public Property vote_percentage As String
    
        Public Sub New()
    
        End Sub
    
        Public Sub New(ByVal id As Integer, ByVal vote_percentage As String)
            Me.id = id
            Me.vote_percentage = vote_percentage
        End Sub
    End Class
    
    Public Class result
    
        Public Property finalist As finalist
    
        Public Sub New()
            finalist = New finalist
        End Sub
    
        Public Sub New(ByVal id As Integer, ByVal vote_percentage As String)
            Me.finalist = New finalist(id, vote_percentage)
        End Sub
    
    End Class
    
  4. 单独进行反序列化:

    _result = System.Text.Encoding.ASCII.GetString(data)
    
    Dim Results As New List(Of result)
    
    Results = JsonConvert.DeserializeObject(Of List(Of result))(_result)
    
    RaiseEvent VoteCompleted(loopCounter, _VoteCount, time, _result)
    

    它有效。

    新人的笔记(像我一样)。使用JSON.NET时,您必须拥有构造函数方法(即Sub New),以便在反序列化调用期间设置属性。

1 个答案:

答案 0 :(得分:1)

我不知道JSON.NET但是我可以告诉你有一个对象数组,它们的结构与VB.NET类定义的结构不同。

如果格式化JSON,您可以更清楚地看到这一点:

[
  {
    "finalist": {
      "id": 12,
      "vote_percentage": "28"
    }
  },

  {
    "finalist": {
      "id": 13,
      "vote_percentage": "6"
    }
  },

  ...
]

猜测(因为我对.NET平台知之甚少)JSON.NET需要一个具有相同结构的类的实例列表 - 所以像这样的类定义(伪代码) ):

class item
    public property finalist as result

class result
    public property id as Integer
    public property vote_percentage as String

您可能还想做的只是摆脱item类并在JSON中直接使用result对象:

[
  {
    "id": 12,
    "vote_percentage": "28"
  },

  {
    "id": 13,
    "vote_percentage": "6"
  },

  ...
]

这样,你有一个简化的对象数组,代表result个实例,没有看似无用的“包装器对象”(即那些代表item实例的对象)。