Roku Parse JSON выдает ошибку Unknow Identifier при загрузке json через AJAX - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь написать простое приложение Roku.

Когда я загружаю файл JSON через roURLTransfer Parse JSON, функция дает мне BRIGHTSCRIPT: ERROR: ParseJSON: Unknown identifier.

Если Я загружаю файл JSON через ReadAsciiFile("pkg:/feed/feed.json"), он работает.

Файл JSON такой же, и я уверен, что мой JSON правильный.

url = "http://192.168.1.36/misc/roku/ifilm/feed.json"
result = ""
timeout = 10000

ut = CreateObject("roURLTransfer")
ut.SetPort(CreateObject("roMessagePort"))
ut.SetURL(url)
if ut.AsyncGetToString()
    event = wait(timeout, ut.GetPort())
    if type(event) = "roUrlEvent"
        result = event.GetString()
    elseif event = invalid
        ut.AsyncCancel()
    else
        print "roUrlTransfer::AsyncGetToString(): unknown event"
    end if
end if

' `print result` shows the correct lintable JSON
' print result
' Next line gives me: BRIGHTSCRIPT: ERROR: ParseJSON: Unknown identifier
json = ParseJSON(result)

Но размещение файла JSON внутри приложения работает:

feed = ReadAsciiFile("pkg:/feed/feed.json")
sleep(2000)

json = ParseJson(feed)

Мне нужно загрузить данные из Inte rnet, и использование встроенной версии мне не помогает. Кто-нибудь знает, что я должен сделать, чтобы это работало?

1 Ответ

2 голосов
/ 24 апреля 2020

Ошибка "Неизвестный идентификатор" обычно возникает из-за того, что в строке json есть символ, который ParseJson() не поддерживает. Причина, по которой работает ReadAsciiFile(), вероятно, заключается в том, что функция «очищает» строку json, применяя кодировку UTF-8.

Общий символ, присутствующий в начале некоторых ответов JSON, который вызывает эта проблема - символ Unicode Метка порядка байтов (BOM)

Если вы Google "метка порядка байтов json" увидеть множество случаев, когда это влияет и на другие платформы.

Вы можете просто найти и заменить, чтобы избавиться от этого символа, прежде чем пытаться разобрать строку.

bomChar = Chr(65279)
if result.left(len(bomChar)) = bomChar ' Check if the string has the BOM char prefix
    result = result.replace(bomChar, "")
end if

Если это не работает, тогда ваш ответ может иметь какой-то другой конфликтующий символ, в этом случае я бы посоветовал использовать ifUrlTransfer::AsyncGetToFile() вместо AsyncGetToString(), а затем использовать ReadAsciiFile(), который должен гарантировать правильно отформатированный json строка каждый раз (при условии, что ваш json действителен).

...