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 をブラウザ上で動かすことができる。
TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする

作品ID(フリンジは1705)とシーズン番号1を設定して、Mock Server を選んで Call Resource をクリック。
TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする

すると、Fringe のシーズン1  の JSON形式の取得結果が表示される。
TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする

サンプルコードも生成してくれる。
TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする

 

サンプルコードを元に書いてみる

サンプルコードに従って書くとこんな感じ。デバッグ実行なので MsgBox 入れてる。UTF-8 へのエンコードとハッシュテーブルへの登録が不要になる。

test2.aspx.vb
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)

    End Sub

End Class

取得結果
TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする
オブジェクトに格納
TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする

従来は・・・

従来は WebClient の Download で JSON形式のデータ をバイト列に格納し、それをUTF-8でエンコードして、デシリアライズし、ハッシュテーブルにいったん入れてからオブジェクトに格納していた。

※従来のはJSON形式をデシリアライズする関数にしているので、上記のサンプルコードとは実行形態が異なる。

TMDbTV.vb
Public Shared Function GetTMDbJSON(ByVal TargetURL As String) As Object

    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 に反映済。ただし、シーズン情報をオブジェクトに格納するメソッドは後日作成。


TMDb API V3 を利用して取得した JSON形式 のデータを ASP.NET でデシリアライズする

 

test2.aspx
Imports System.Net
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

 

TMDbTVSeason.vb
'-----------------------------------------------------------------------------------------------------------------
'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

 

TMDbTVCredits.vb
'-----------------------------------------------------------------------------------------------------------------
'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への組み込みも近いかな。

08091011

コメント

このブログの人気の投稿

ダブルクォーテーションで括られたCSVカ​ンマ区切りテキストファイルを SQL Server で Bulk Insert する方法

PowerShellでTSV/CSVの列を絞り込んで抽出し、(先頭/行末)からN行出力する

IKEAの鏡を壁に取り付ける