如何从 Roku Scenegraph (brightscript) 中的多个 JSON 文件进行解析?

How do I Parse from Multiple JSON files in Roku Scenegraph (brightscript)?

我正在使用 SceneGraph 开发人员扩展 SGDEX (Roku Brightscript)。我设置了一个非常好的工作脚本。我当前的脚本从 1 JSON 个文件解析。我想做的是从目录中的多个 JSON 文件中解析。

目前我正在从“http://feedserver.com/feed/feed.json”解析 我想从以下目录 'http://feedserver.com/feed/'

中的每个文件中解析

我试过简单地将 url 更改为“http://feedserver.com/feed” 我也尝试过使用 ListDir("http://feedserver.com/feed") 代替 feed.= url.GetToSTring() 在这两种情况下,我在测试脚本时都会出现空白屏幕。

sub GetContent()
    url = CreateObject("roUrlTransfer")
    url.SetUrl("http://feedserver.com/feed.json")
    feed = url.GetToString()
    Sleep(2000) ' to emulate API call
    json = ParseJson(feed)
    rootNodeArray = ParseJsonToNodeArray(json)
    m.top.content.Update(rootNodeArray)
end sub

function ParseJsonToNodeArray(jsonAA as Object) as Object
    if jsonAA = invalid then return []
    resultNodeArray = {
       children: []
    }

    for each fieldInJsonAA in jsonAA
        ' Assigning fields that apply to both movies and series
        if fieldInJsonAA = "movies" or fieldInJsonAA = "series" or fieldInJsonAA = "search"
            mediaItemsArray = jsonAA[fieldInJsonAA]
            itemsNodeArray = []
            for each mediaItem in mediaItemsArray
                itemNode = ParseMediaItemToNode(mediaItem, fieldInJsonAA)
                itemsNodeArray.Push(itemNode)
            end for
            rowAA = {
               title: fieldInJsonAA
               children: itemsNodeArray
            }

           resultNodeArray.children.Push(rowAA)
       end if
    end for

    return resultNodeArray
end function

function ParseMediaItemToNode(mediaItem as Object, mediaType as String) as Object
    itemNode = Utils_AAToContentNode({
            "id": mediaItem.id
            "title": mediaItem.title
            "hdPosterUrl": mediaItem.thumbnail
            "Description": mediaItem.shortDescription
            "Categories": mediaItem.genres[0]
        })

    if mediaItem = invalid then
        return itemNode
    end if

    ' Assign movie specific fields
    if mediaType = "movies"
        Utils_forceSetFields(itemNode, {
            "Url": GetVideoUrl(mediaItem)
        })
    end if

    ' Assign series specific fields
    if mediaType = "series"
        seasons = mediaItem.seasons
        seasonArray = []
        for each season in seasons
            episodeArray = []
            episodes = season.Lookup("episodes")
            for each episode in episodes
                episodeNode = Utils_AAToContentNode(episode)
                Utils_forceSetFields(episodeNode, {
                    "url": GetVideoUrl(episode)
                    "title": episode.title
                    "hdPosterUrl": episode.thumbnail
                    "Description": episode.shortDescription
                })
                episodeArray.Push(episodeNode)
            end for
            seasonArray.Push(episodeArray)
        end for
        Utils_forceSetFields(itemNode, {
            "seasons": seasonArray
        })
    end if
    return itemNode
end function

function GetVideoUrl(mediaItem as Object) as String
    content = mediaItem.Lookup("content")
    if content = invalid then
        return ""
    end if

    videos = content.Lookup("videos")
    if videos = invalid then
        return ""
    end if

    entry = videos.GetEntry(0)
    if entry = invalid then
        return ""
    end if

    url = entry.Lookup("url")
    if url = invalid then
        return ""
    end if

    return url
end function

在脚本示例中,我提供了一个解析 1 JSON 文件的工作脚本。我需要脚本以完全相同的方式执行,除了解析目录中的多个文件。

谢谢,

我想通了。

Roku 可以从 php 文件生成输出,如果它输出 json 或 xml。话虽如此,我所做的是从服务器端配置 php,从我喜欢的多个 json 提要中提取,并将 url 提要指向 php文件。见下文。

url = CreateObject("roUrlTransfer")
url.SetUrl("http://feedserver.com/jsonfeed.php?output=json")