TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする
で、JSON形式をデシリアライズして、オブジェクトクラスに格納する記事を書いたが、WebClient の Download で JSON形式のデータを取得していた。TMDb API マニュアルにSystem.IO.StreamReader を使って JSON形式のデータを取得するサンプルがあったので試してみる。
TMDb API V3 を利用して、Fringe のシーズン1 の取得を例にする。
TMDb API の開発者向けサイトでテストできるの知った
TMDb API の開発者向けサイトでは、API をWeb上で動かすことができるのを知った。Switch Console または Try をクリックすると API をブラウザ上で動かすことができる。
作品ID(フリンジは1705)とシーズン番号1を設定して、Mock Server を選んで Call Resource をクリック。
サンプルコードを元に書いてみる
サンプルコードに従って書くとこんな感じ。デバッグ実行なので MsgBox 入れてる。UTF-8 へのエンコードとハッシュテーブルへの登録が不要になる。
Inherits System.Web.UI.Page
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim objresults As New Object
Dim objSrializer As JavaScriptSerializer = New JavaScriptSerializer()
Dim url As String = "http://api.themoviedb.org/3/tv/" + "1705" + "/season/" + "1" + "?api_key=*************"
Dim request = TryCast(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
request.Method = "GET"
request.Accept = "application/json"
request.ContentLength = 0
Dim responseContent As String = ""
Try
Using response = TryCast(request.GetResponse(), System.Net.HttpWebResponse)
Using reader = New System.IO.StreamReader(response.GetResponseStream())
responseContent = reader.ReadToEnd()
End Using
End Using
Catch ex As WebException
MsgBox("ng:" + ex.Message)
objresults = Nothing
Exit Sub
End Try
Label1.Text = responseContent
objresults = objSrializer.Deserialize(Of Object)(responseContent)
End Sub
End Class
従来は・・・
従来は WebClient の Download で JSON形式のデータ をバイト列に格納し、それをUTF-8でエンコードして、デシリアライズし、ハッシュテーブルにいったん入れてからオブジェクトに格納していた。
※従来のはJSON形式をデシリアライズする関数にしているので、上記のサンプルコードとは実行形態が異なる。
Dim objWeb As WebClient = New WebClient()
Dim objSrializer As JavaScriptSerializer = New JavaScriptSerializer()
Dim objEncode As Encoding = Encoding.UTF8
Dim byteResult As Byte() = Nothing
Dim objresults As New Object
Try
byteResult = objWeb.DownloadData(TargetURL)
Catch ex As WebException
objresults = Nothing
Return objresults
Exit Function
End Try
Dim UT8byteResult As String = objEncode.GetString(byteResult)
Dim Hash As Hashtable = objSrializer.Deserialize(Of Hashtable)(UT8byteResult)
objresults = Hash
Return objresults
End Function
どちらにしようか?
どちらがいいのかわからないけど、どちらでもJSONをデシリアライズできる。
シーズン情報をオブジェクト化
まずはシーズン情報をオブジェクト化まで。MJBTMDb.dll に反映済。ただし、シーズン情報をオブジェクトに格納するメソッドは後日作成。
Imports System.Web.Script.Serialization
Imports MJBTMDb.V3
Partial Class test2
Inherits System.Web.UI.Page
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim objresults As New Object
Dim objSrializer As JavaScriptSerializer = New JavaScriptSerializer()
Dim url As String = "http://api.themoviedb.org/3/tv/" + "1705" + "/season/" + "1" + "?api_key=*********************"
Dim request = TryCast(System.Net.WebRequest.Create(url), System.Net.HttpWebRequest)
request.Method = "GET"
request.Accept = "application/json"
request.ContentLength = 0
Dim responseContent As String = ""
Try
Using response = TryCast(request.GetResponse(), System.Net.HttpWebResponse)
Using reader = New System.IO.StreamReader(response.GetResponseStream())
responseContent = reader.ReadToEnd()
End Using
End Using
Catch ex As WebException
MsgBox("ng:" + ex.Message)
objresults = Nothing
Exit Sub
End Try
Label1.Text = responseContent
objresults = objSrializer.Deserialize(Of Object)(responseContent)
Dim objTMDbSeasons As New TMDbTVSeason
objTMDbSeasons.air_date = objresults("air_date")
objTMDbSeasons.id = objresults("id")
objTMDbSeasons.name = objresults("name")
objTMDbSeasons.overview = objresults("overview")
objTMDbSeasons.poster_path = objresults("poster_path")
objTMDbSeasons.season_number = objresults("season_number")
Dim ListEpisode As New List(Of Episode)
For Each episode In objresults("episodes")
Dim objEpisode As New Episode
objEpisode.air_date = episode("air_date")
Dim ListCrew As New List(Of TvCrew)
For Each crew In episode("crew")
Dim objCrew As New TvCrew
objCrew.credit_id = crew("credit_id")
objCrew.department = crew("department")
objCrew.id = crew("id")
objCrew.job = crew("job")
objCrew.name = crew("name")
objCrew.profile_path = crew("profile_path")
ListCrew.Add(objCrew)
Next
objEpisode.Crews = ListCrew
objEpisode.episode_number = episode("episode_number")
Dim ListGuestStar As New List(Of TvCast)
For Each GuestStar In episode("guest_stars")
Dim objGuestStar As New TvCast
objGuestStar.character = GuestStar("character")
objGuestStar.credit_id = GuestStar("credit_id")
objGuestStar.id = GuestStar("id")
objGuestStar.name = GuestStar("name")
objGuestStar.order = GuestStar("order")
objGuestStar.profile_path = GuestStar("profile_path")
ListGuestStar.Add(objGuestStar)
Next
objEpisode.guest_stars = ListGuestStar
objEpisode.id = episode("id")
objEpisode.name = episode("name")
objEpisode.overview = episode("overview")
objEpisode.production_code = episode("production_code")
objEpisode.season_number = episode("season_number")
objEpisode.still_path = episode("still_path")
objEpisode.vote_average = episode("vote_average")
objEpisode.vote_count = episode("vote_count")
ListEpisode.Add(objEpisode)
Next
objTMDbSeasons.episodes = ListEpisode
End Sub
End Class
'TV
'-----------------------------------------------------------------------------------------------------------------
Namespace V3
Public Class TMDbTVSeason
Public Property air_date() As String
Public Property episodes() As List(Of Episode)
Public Property name() As String
Public Property overview() As String
Public Property id() As Integer
Public Property poster_path() As String
Public Property season_number() As Integer
End Class
Public Class Episode
Public Property id() As Integer
Public Property air_date() As String
Public Property Crews() As List(Of TvCrew)
Public Property episode_number() As Integer
Public Property guest_stars() As List(Of TvCast)
Public Property name() As String
Public Property overview() As String
Public Property production_code() As String
Public Property season_number() As Integer
Public Property still_path() As String
Public Property vote_average As Int64
Public Property vote_count() As Integer
End Class
End Namespace
'TV:
'-----------------------------------------------------------------------------------------------------------------
Namespace V3
Public Class TMDbTVCredits
Public Property id() As Integer
Public Property cast() As List(Of TvCast)
Public Property crew() As List(Of TvCrew)
End Class
Public Class TvCast
Public Property id() As Integer
Public Property character() As String
Public Property credit_id() As String
Public Property name() As String
Public Property profile_path() As String
Public Property order() As Integer
End Class
Public Class TvCrew
Public Property id() As Integer
Public Property credit_id() As String
Public Property name() As String
Public Property profile_path() As String
Public Property job() As String
Public Property department() As String
End Class
End Namespace
今はこんな感じ
時間が取れなくて、1か月以上も空いてしまった。年齢のせいか、これまでにやっていたことを思い出すのに2時間もかかった。
IT土方と呼ばれるような追い込まれてやるようなのは自分には全く向いていないけど、こう間が空いてしまうと忘れてしまうので、毎日少しでもいいからコーディングしたいところ。でも時間とれないんだよね。
キャスト、スタッフ情報も取得できたので、MovieJukeBoxへの組み込みも近いかな。
コメント
コメントを投稿