Json不能用VB.net反序列化Youtube数据

时间:2017-07-29 10:01:34

标签: json vb.net json.net

我需要获得&#34;标题&#34;从我从Youtube得到的回应。 我在第8行第12位得到以下错误,即在第<7行:

"items": [

在&#34; [&#34;

之后

我得到的错误是:

Exception: Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll ("Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'categoryid.Item' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'items', line 8, position 12."). Exception thrown: 'Newtonsoft.Json.JsonSerializationException' in Newtonsoft.Json.dll ("Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'categoryid.Item' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'items', line 8, position 12.")    2.61s       [12096] <No Name> 

我有这段代码:

 Dim m As IEnumerable(Of Rootobject) = JsonConvert.DeserializeObject(Of IEnumerable(Of Rootobject))(res)

使用此JSON数据:

{
 "kind":"youtube#videoListResponse",
 "etag":"\"m2yskBQFythfE4irbTIeOgYYfBU/jznkhy3_Aws9VtommTkcdOYnAAk\"",
 "pageInfo":{
  "totalResults":1,
  "resultsPerPage":1
 },
 "items":[
  {
   "kind":"youtube#video",
   "etag":"\"m2yskBQFythfE4irbTIeOgYYfBU/M_wQmC4lQBaHJGxo79N7WlmqNr8\"",
   "id":"SSbBvKaM6sk",
   "snippet":{
    "publishedAt":"2009-04-15T20:31:11.000Z",
    "channelId":"UC2kTZB_yeYgdAg4wP2tEryA",
    "title":"Blur - Song 2",
    "description":"Blur 21 -- Celebrating 21 years of Blur. To find out more, click here:http://smarturl.it/blur21y\n\n#blur21\n            \nFollow Blur on Twitter:www.twitter.com/blurofficial \nFind Blur on Facebook:www.facebook.com/blur\n\nMusic video by Blur performing Song 2.",
    "thumbnails":{
     "default":{
      "url":"https://i.ytimg.com/vi/SSbBvKaM6sk/default.jpg",
      "width":120,
      "height":90
     },
     "medium":{
      "url":"https://i.ytimg.com/vi/SSbBvKaM6sk/mqdefault.jpg",
      "width":320,
      "height":180
     },
     "high":{
      "url":"https://i.ytimg.com/vi/SSbBvKaM6sk/hqdefault.jpg",
      "width":480,
      "height":360
     },
     "standard":{
      "url":"https://i.ytimg.com/vi/SSbBvKaM6sk/sddefault.jpg",
      "width":640,
      "height":480
     },
     "maxres":{
      "url":"https://i.ytimg.com/vi/SSbBvKaM6sk/maxresdefault.jpg",
      "width":1280,
      "height":720
     }
    },
    "channelTitle":"emimusic",
    "tags":[
     "Blur",
     "Song"
    ],
    "categoryId":"10",
    "liveBroadcastContent":"none",
    "localized":{
     "title":"Blur - Song 2",
     "description":"Blur 21 -- Celebrating 21 years of Blur. To find out more, click here:http://smarturl.it/blur21y\n\n#blur21\n            \nFollow Blur on Twitter:www.twitter.com/blurofficial \nFind Blur on Facebook:www.facebook.com/blur\n\nMusic video by Blur performing Song 2."
    }
   },
   "contentDetails":{
    "duration":"PT2M3S",
    "dimension":"2d",
    "definition":"sd",
    "caption":"false",
    "licensedContent":true,
    "regionRestriction":{
     "allowed":[
      "BY",
      "US"
     ]
    },
    "projection":"rectangular"
   }
  }
 ]
}

和这些课程。这些课程被视觉工作室2015选项粘贴为特殊。

Public Class Rootobject
    Public Property kind As String
    Public Property etag As String
    Public Property pageInfo As Pageinfo
    Public Property items() As Item
End Class

Public Class Pageinfo
    Public Property totalResults As Integer
    Public Property resultsPerPage As Integer
End Class

Public Class Item
    Public Property kind As String
    Public Property etag As String
    Public Property id As String
    Public Property snippet As Snippet
    Public Property contentDetails As Contentdetails
End Class

Public Class Snippet
    Public Property publishedAt As Date
    Public Property channelId As String
    Public Property title As String
    Public Property description As String
    Public Property thumbnails As Thumbnails
    Public Property channelTitle As String
    Public Property tags() As String
    Public Property categoryId As String
    Public Property liveBroadcastContent As String
    Public Property localized As Localized
End Class

Public Class Thumbnails
    Public Property _default As _Default
    Public Property medium As Medium
    Public Property high As High
    Public Property standard As Standard
    Public Property maxres As Maxres
End Class

Public Class _Default
    Public Property url As String
    Public Property width As Integer
    Public Property height As Integer
End Class

Public Class Medium
    Public Property url As String
    Public Property width As Integer
    Public Property height As Integer
End Class

Public Class High
    Public Property url As String
    Public Property width As Integer
    Public Property height As Integer
End Class

Public Class Standard
    Public Property url As String
    Public Property width As Integer
    Public Property height As Integer
End Class

Public Class Maxres
    Public Property url As String
    Public Property width As Integer
    Public Property height As Integer
End Class

Public Class Localized
    Public Property title As String
    Public Property description As String
End Class

Public Class Contentdetails
    Public Property duration As String
    Public Property dimension As String
    Public Property definition As String
    Public Property caption As String
    Public Property licensedContent As Boolean
    Public Property regionRestriction As Regionrestriction
    Public Property projection As String
End Class

Public Class Regionrestriction
    Public Property allowed() As String
End Class

我需要做什么? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

您正在获取该异常,因为您已错误地声明了几个自动实现的数组属性。如 Auto-Implemented Properties (Visual Basic) 所示,此类属性应声明如下,()数组指示符作为返回类型的一部分:

Public Property items As Item()

而是将它们声明如下:

Public Property items() As Item

这声明一个属性返回单个Item而不是它们的数组。附加到属性名称()是可选的;对于无参数属性,它是多余的,但对于采用参数的属性,参数列表出现在那里。有关详细信息,请参阅文档页面 Property Statement 。然后Json.NET抛出您在尝试将JSON数组反序列化为模型中的一个非数组属性时看到的异常。

要解决此问题,应按如下方式修改三个类:

Public Class Rootobject
    Public Property kind As String
    Public Property etag As String
    Public Property pageInfo As Pageinfo

    Public Property items As Item()   ' Fixed 

End Class

Public Class Snippet
    Public Property publishedAt As Date
    Public Property channelId As String
    Public Property title As String
    Public Property description As String
    Public Property thumbnails As Thumbnails
    Public Property channelTitle As String

    Public Property tags As String()   ' Fixed 

    Public Property categoryId As String
    Public Property liveBroadcastContent As String
    Public Property localized As Localized
End Class

Public Class Regionrestriction

    Public Property allowed As String()   ' Fixed 

End Class

然后,由于items是一个数组,要访问标题然后放入列表,您可以使用System.Linq.Enumerable中的扩展方法:

' Convert the json string to RootObject.
Dim root = JsonConvert.DeserializeObject(Of Rootobject)(json)

' Extract the list of titles.
Dim titles = root.items _
    .Select(Function(i) i.snippet.title) _
    .ToList()

' Get the first title in the list.
Dim firstTitle = titles.FirstOrDefault()

Console.WriteLine("First title = ""{0}""", firstTitle)

打印出First title = "Blur - Song 2"

示例VB.Net fiddle