如何从 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")
我正在使用 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")