2012-02-03 81 views
3

我试图在Visual Basic中使用JSON.NET库将一个简单的JSON数组反序列化为.NET对象。反序列化VB.NET中的JSON数据的问题

对于我的生活,我无法弄清楚我在这里做错了什么。我的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“}},{”finalist“:{”id“:20,”vote_percentage“:”1“}}]

最后我反序列化:

Dim Results As New List(Of result) 

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

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

我在绞尽脑汁,所以如果有人能把我的骨头扔掉,我会很感激。

谢谢。

UPDATE:

因此,这里是得到这个工作,我所做的更改:

  1. 修改了我的结果类包含类型为入围的属性决赛
  2. 创建一个新的类入围与属性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 
    

单独留下解串:

_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),才能在反序列化调用期间设置属性。

+0

你可以尝试解析没有包装finalist属性的json吗?目前,你只有一个只有finalist属性的对象数组,而你的类没有这个属性。 – pimvdb 2012-02-03 17:56:52

+0

我不明白你的意思。你是否建议我从json字符串中移除决赛选手的所有实例?我的印象是入围者映射到了一个结果类的单个实例。 – jdbenn 2012-02-03 18:11:38

+0

pimvdb - 你把我带到了一些东西上,并修复了它。我更新了我的代码以显示工作解决方案。 – jdbenn 2012-02-03 18:16:17

回答

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类和使用result对象直接像这样在你的JSON:

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

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

    ... 
] 

这样的话,你有代表result实例对象的简化阵列,而不看似无用的“包装物”(即那些代表item实例)。