Androidで動くBASICでJSONを扱う（ BASIC プログラミング ）

【注意事項】

> * この記事は個人用の備忘録です。
> * とてもニッチでマニアックです。BASIC!を使う場合以外の利用方法は全くありません。
> * あまりにニッチすぎてマニアックな為、忘れてしまうので記事にしました。 
> * 記事中にHTMLやJavascriptの内容がありますが投稿者の知識レベルは低いです。正直よくわかんないけどやったら動きました♪…レベルです。 

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

* [AndroidでBASICを使う](http://qiita.com/basictomonokai/items/25bcb21ec69c00e9ad23)

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


## 1.前提

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


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

> [iTunes StoreのJSON](https://itunes.apple.com/us/rss/toppaidebooks/limit=10/json)

* HTTP アクセス制御 (CORS)については筆者は十分理解していません。
* テストして実際に取得できたのでまとめを書いています。

## 2.取得方法

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

* 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タグの０番目で取得できるのかはよく判ってません。ドキュメントがREADYになるまで無理矢理pauseしています。

## 3.まとめ

このようにBASIC!ではJSONの受信方法はいくつかあります。どう考えてもネイティブが楽ですが…(^_^;)