Cannot Json deserialize Youtube data with VB.net

风流意气都作罢 提交于 2019-12-18 09:42:14

问题


I need to obtain the "title" from the response i get from Youtube. I get the following error at line 8, position 12, that is, at line:

"items": [

just after the "["

The error i get is:

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> 

I have this code:

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

with this JSON data:

{
 "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"
   }
  }
 ]
}

and these classes. the classes are pasted as special with the visual studio 2015 option.

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

What i need to do? Thanks in advance.


回答1:


You are getting that exception because you have declared several auto-implemented array properties incorrectly. As shown in Auto-Implemented Properties (Visual Basic) such properties should be declared as follows, with the () array indicator as part of the return type:

Public Property items As Item()

Instead you declare them as follows:

Public Property items() As Item

This declares a property returning a single Item rather than an array of them. The () attached to the property name is optional; for parameterless properties it is redundant but for properties taking parameters the argument list appears there. See the documentation page Property Statement for details. Then Json.NET throws the exception you see when attempting to deserialize a JSON array into one of the non-array properties in your model.

To fix this, three of your classes should be modified as follows:

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

Then, since the items are an array, to access the titles and put then in a list, you can use extension methods from 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)

Which prints out First title = "Blur - Song 2".

Sample VB.Net fiddle.



来源:https://stackoverflow.com/questions/45387913/cannot-json-deserialize-youtube-data-with-vb-net

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!