Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.NET中反序列化JSON数据的问题_Vb.net_Json_Json.net_Deserialization - Fatal编程技术网

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

VB.NET中反序列化JSON数据的问题,vb.net,json,json.net,deserialization,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 Pub

我试图使用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,“投票率”:“28”},{“决赛者”:{“id”:13,“投票率”:“6”},{“决赛者”:{“id”:14,“投票率”:“4”},{“决赛者”:{“id”:15,“投票率”:“3”},{“决赛者”:{“id”:16,“投票率”:“7”},{“决赛者”:{“id”:17,“投票率”:“1”},{“id”:18,{“决赛者”:{“投票率”:,“投票百分比”:“2”},{“决赛选手”:{“id”:20,“投票百分比”:“1”}]

最后,我的反序列化:

Dim Results As New List(Of result)

Results = JsonConvert.DeserializeObject(Of List(Of result))(_result)
结果是9个对象没有指定任何特性值

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

谢谢

更新:

这就是我所做的改变,让这一切得以实现:

  • 修改我的结果类以包含类型为finalist的属性finalist
  • 创建了一个具有属性id和投票率的新班级决赛选手

    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)。

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

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

    [
    {
    “决赛选手”:{
    “id”:12,
    “投票率”:“28”
    }
    },
    {
    “决赛选手”:{
    “id”:13,
    “投票率”:“6”
    }
    },
    ...
    ]
    
    我猜(因为我对.NET平台知之甚少),JSON.NET需要一个具有相同结构的类的实例列表——因此类似这样的类定义(伪代码):

    您可能还想做的是简单地去掉
    类,直接在JSON中使用
    结果
    对象:

    [
    {
    “id”:12,
    “投票率”:“28”
    },
    {
    “id”:13,
    “投票率”:“6”
    },
    ...
    ]
    

    这样,您就有了一个表示
    result
    实例的简化对象数组,而没有看似无用的“包装器对象”(即那些表示
    item
    实例的对象).

    您能尝试在不使用包装的finalist属性的情况下解析json吗?目前您有一个只包含finalist属性的对象数组,而您的类没有。我不明白您的意思。您是否建议我从json字符串中删除finalist的所有实例?我的印象是finalist映射到一个result class.pimvdb的单个实例-你让我发现了一些问题,并解决了它。我更新了代码以显示一个有效的解决方案。这似乎是相关的:@jdben:你能将你的解决方案复制到一个答案并将其标记为已接受(是的,你可以回答你自己的问题并接受你自己的答案)?这样问题就会显示为已回答。
    class item
        public property finalist as result
    
    class result
        public property id as Integer
        public property vote_percentage as String