【注意事項】
- この記事は個人用の備忘録です。
- とてもニッチでマニアックです。BASIC!を使う場合以外の利用方法は全くありません。
- あまりにニッチすぎてマニアックな為、忘れてしまうので記事にしました。
- 記事中にHTMLやJavascriptの内容がありますが投稿者の知識レベルは低いです。正直よくわかんないけどやったら動きました♪…レベルです。
BASIC!は、Androidで動くBASIC インタープリタです。詳しくは以下をどうぞ。
BASIC!でJSONを扱う方法について検討してみました。3つほど考えたのでそれについて書いています。簡単な方法があるのですがそれ以外の方法を調べる必要があり調べました。
1.前提
この記事の前提は以下の通りです。
- JSONのデータとして iTunes Storeのデータを利用しています。
- HTTP アクセス制御 (CORS)については筆者は十分理解していません。
- テストして実際に取得できたのでまとめを書いています。
2.取得方法
取得方法は以下の3つです。
- GRABURL命令による方法
BASIC!のネイティブ命令で取得する最も簡単な方法です。
- HTML+JSを作成してその中で取得
BASIC!のHTMLモードでJSのXMLHttpRequestを利用して取得する方法です。
- javascript擬似プロトコルで取得
BASIC!のHTMLモードで直接JSONを開いてjavascript擬似プロトコルで取得する方法です。
2-1.GRABURL命令による方法
BASIC!のネイティブ命令を利用する方法で通常はこれで十分です。
BASIC!のプログラムコード(一部)は以下です。
GRABURL jsonx$,"https://itunes.apple.com/us/rss/toppaidebooks/limit=10/json"
PRINT jsonx$
文字列変数jsonx$にJSONが格納されます
2-2.HTML+JSを作成してその中で取得
BASIC!のHTMLモードでHTMLとJSを使って取得する方法です。あえてこの方法を採る理由は無いような気がします。
ここではBASIC!のプログラムは一般的なHTMLモードのプログラムなのでHTML+JSのみ掲載します。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script type="text/javascript">
function getJson() {
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4) {
if (xmlhttp.status == 200) {
console.log(xmlhttp.responseText);
document.getElementById('getresult').innerHTML = xmlhttp.responseText;
// alert(xmlhttp.responseText);
Android.dataLink(xmlhttp.responseText);
} else {
}
}
}
xmlhttp.open("GET", "https://itunes.apple.com/us/rss/toptextbooks/limit=5/genre=9027/json");
xmlhttp.send();
}
</script>
</head>
<body>
<h1>Test json get</h1>
Result:
<div id='getresult'> Result output is here.</div>
<script>
getJson();
</script>
</body>
</html>
XMLHttpRequestを使ってJSONを取得してBASIC!固有のメソッドであるAndroid.dataLinkでデータをBASIC!プログラムに渡します。
2-3.javascript擬似プロトコルで取得
BASIC!のHTMLモードでJSONを直接表示してjavascript擬似プロトコルでAndroid.dataLinkを送り込んで内容を取得する方法です。
この方法だとHTML+JSは別ファイルで用意する必要はありません。BASIC!のHTMLモードプログラムは以下の通りです。
console.title "HTML test"
nxttest:
HTML.OPEN
! Load JSON
HTML.LOAD.URL "https://itunes.apple.com/us/rss/toppaidebooks/limit=10/json"
! wait ready HTML screen
pause 5000
! Send javascript pseudo protocol
html.load.url "javascript:Android.dataLink(document.getElementsByTagName('pre')[0].innerHTML);"
xnextUserAction:
! loop until data$ is not ""
DO
HTML.GET.DATALINK data$
UNTIL data$ <> ""
type$ = LEFT$(data$, 4)
data$ = MID$(data$,5)
! Act on the data type
! Shown are all the current data types
SW.BEGIN type$
! Back Key hit.
! if we can go back then do it
SW.CASE "BAK:"
PRINT "BACK key: " + data$
popup "stopped",0,0,0
pause 2000
end
SW.BREAK
! A hyperlink was clicked on
SW.CASE "LNK:"
PRINT "Hyperlink selected: "+ data$
popup "loading...",0,0,1
! HTML.LOAD.URL data$
browse data$
SW.BREAK
! An error occured
SW.CASE "ERR:"
PRINT "Error: " + data$
popup "error stopped.",0,0,0
pause 2000
exit
SW.BREAK
! JSON data returned
SW.CASE "DAT:"
PRINT "User data: " + data$
msx$=data$+"---->data"
popup msx$,0,0,0
pause 1000
html.close
end
SW.BREAK
! Form data returned.
! Note: Form data returning
! always exits the html.
SW.CASE "FOR:"
PRINT "Form data: "+data$
popup "ended.",0,0,0
pause 2000
exit
SW.BREAK
SW.DEFAULT
PRINT "Unexpected data type:", type$ + data$
popup "ended.",0,0,0
pause 2000
exit
SW.END
GOTO xnextUserAction
end
なぜpreタグの0番目で取得できるのかはよく判ってません。ドキュメントがREADYになるまで無理矢理pauseしています。
3.まとめ
このようにBASIC!ではJSONの受信方法はいくつかあります。どう考えてもネイティブが楽ですが…(^_^;)