Posted at

Androidで動くBASICでJSONを扱う( BASIC プログラミング )

More than 1 year has passed since last update.

【注意事項】



  • この記事は個人用の備忘録です。

  • とてもニッチでマニアックです。BASIC!を使う場合以外の利用方法は全くありません。

  • あまりにニッチすぎてマニアックな為、忘れてしまうので記事にしました。

  • 記事中にHTMLやJavascriptの内容がありますが投稿者の知識レベルは低いです。正直よくわかんないけどやったら動きました♪…レベルです。


BASIC!は、Androidで動くBASIC インタープリタです。詳しくは以下をどうぞ。

BASIC!でJSONを扱う方法について検討してみました。3つほど考えたのでそれについて書いています。簡単な方法があるのですがそれ以外の方法を調べる必要があり調べました。


1.前提

この記事の前提は以下の通りです。


  • JSONのデータとして iTunes Storeのデータを利用しています。


iTunes StoreのJSON



  • HTTP アクセス制御 (CORS)については筆者は十分理解していません。

  • テストして実際に取得できたのでまとめを書いています。


2.取得方法

取得方法は以下の3つです。


  • GRABURL命令による方法


BASIC!のネイティブ命令で取得する最も簡単な方法です。



  • HTML+JSを作成してその中で取得


BASIC!のHTMLモードでJSのXMLHttpRequestを利用して取得する方法です。



  • javascript擬似プロトコルで取得


BASIC!のHTMLモードで直接JSONを開いてjavascript擬似プロトコルで取得する方法です。



2-1.GRABURL命令による方法

BASIC!のネイティブ命令を利用する方法で通常はこれで十分です。

BASIC!のプログラムコード(一部)は以下です。


graburl.bas

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のみ掲載します。


test.html

<!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モードプログラムは以下の通りです。


pseudo.bas

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の受信方法はいくつかあります。どう考えてもネイティブが楽ですが…(^_^;)