ExcelのテーブルをJSON形式に変換するマクロ

ある目的があって試しに作ってみたところ簡単にできたものの実際には使わなかったマクロを紹介します。
ExcelのテーブルをJSON形式に変換するマクロです。
次のような表があったとします。 (さらに…)

Bing APIを使う

BingもGoogleやYahoo!と同様にAPIがあります。
IDを取得すれば、簡単に使うことができます。

使い方は次の通りです。 (さらに…)

WikipediaAPIを使ってみる

今、GoogleやYahoo!のAPIについて調べているのですが、その中でウィキペディアの検索結果を取得できるAPIがあることを知りました。

WikipediaAPI - ウィキペディア情報をサイトで利用できるAPI

5年も前からあるのですね。
どんな動きをするのか、サンプルを作って確認してみました。jQueryを使っています。

HTML

<input type="text" id="word">
<input type="button" id="sbtn" value="search">
<div id="mydiv"></div>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>
<script>
//ここにコード
</script>

コード

$("#sbtn").click(function () {
    $("#mydiv").empty();
    var url = "http://wikipedia.simpleapi.net/api?output=json&keyword=";
    url += encodeURI($("#word").val());
    $.getJSON(url, null, function (data, status) {
        for (var i = 0; i < data.length; i++) {
            $("#mydiv").append("<h2>" + data[i].title + "</h2>");
            $("#mydiv").append("<p>" + (data[i].body).replace(/<.*?>/g, "") + "</p>");
        }
    });
});

検索した言葉だけでなく、関連する言葉についても検索してくれるようです。検索結果は検索した言葉によって件数が変わります。

JSONの\uXXXXをデコード

TwitterAPIなどを使い、JSON形式でデータを取得した場合、文字列が次のようになっている場合があります。

\u4eca\u671d\u306f

初めて見ると「文字化けか」と思ってしまうかもしれませんが、これはJSONのルール通りなんだそうです。
この「\uXXXX」形式は「Unicode文字エスケープシーケンス」、「unicode escape sequence」などと呼ぶそうです。
2.4.1 Unicode 文字エスケープ シーケンス (C#)
Unicodeにおける文字番号を4桁の16進数に置き換えて、頭に「\u」を付けます。
これをJavaScriptを使って人間が読める形にする方法(デコード)を調べました。

単純な方法

簡単なのは次のようにJavaScriptでページに書く方法です。

document.write("\u4eca\u671d\u306f");

これで次のように表示されます。

今朝は

関数を使う方法

「json_str_decode」という関数を作ってみました。
このケースでは「\」が(JavaScriptの)エスケープシーケンスに該当してしまうので「\\」のようにしないと正しく認識しません。

document.write(json_str_decode("\\u4eca\\u671d\\u306f"));
function json_str_decode(str){
    arrs=str.match(/\\u.{4}/g);
    var t="";
    for(i=0;i<arrs.length;i++){
        t+=String.fromCharCode(arrs[i].replace("\\u","0x"));
    }
    return(t);
}

次のようにテキストエリアなどに貼り付けて使う場合には「\\」とする必要がありません。

<textarea id="ta">\u4eca\u671d\u306f</textarea>
<div id="mydiv"></div>
var a=document.getElementById("ta").value;
document.write(json_str_decode(a));

Twitter APIを使い、JSON形式でツイートを取得

Twitter APIについて調べたので、メモ的に書いておきます。

URLとして「http://api.twitter.com/1/statuses/user_timeline/stabucky.json?count=1」を指定すると次のようにJSON形式で戻ってきます。
つまり直近1回分のツイートの内容を示しています。

{
    "favorited": false,
    "text": "\u300c\u6c17\u4ed9",
    "retweet_count": 0,
    "coordinates": null,
    "in_reply_to_screen_name": null,
    "in_reply_to_status_id_str": null,
    "place": null,
    "in_reply_to_status_id": null,
    "contributors": null,
    "geo": null,
    "retweeted": false,
    "source": {アプリケーション},
    "created_at": "Thu Apr 14 11:51:40 +0000 2011",
    "in_reply_to_user_id_str": null,
    "in_reply_to_user_id": null,
    "user": {省略},
    "truncated": false,
    "id": 58497645043392512,
    "id_str": "58497645043392512"
}
text

ツイートの内容です。
「\u300c」のように文字化けしているように見えますが、これはエンコードされているだけで、ブラウザに表示すると「気」と正しく表示されます。

sourse

省略しました。
ツイートしたときのアプリケーションが表示されます。

created_at

ツイートしたときの時刻です。

user

省略しました。
ユーザーの名前などの情報が表示されます。
ツイートするたびに同じ情報が表示されます。
上の例ではcount=1なので1回だけですが、count=100とすると、その時点のユーザー情報について同じものを100回返してきます。

id、id_str

そのツイートを指す、ユニークな(唯一の)番号です。
idもid_strも同じものですが、idは数値、id_strは文字列になっています。
JavaScriptなどのプログラムでidの数値が大きすぎて丸められてしまうケースがあります。その場合はid_strを使うとうまくいく場合があります。文字列なので丸められません。

PHPでGoogle Image Search APIを使う

自分のウェブサイトにキーワードに関連した画像を貼り付けたいと思います。
Googleのイメージ検索(Google Image Search API)を使い、PHPで取得する方法を使います。

API Keyの取得

APIを使うには自分自身のKeyを取得する必要があります。
ここでは関係ないですが、このKeyは他の検索でも同じものを使うことができます。

URL

検索のためのURLを与えるとJSON形式で検索結果が戻ってきます。
基本的なURLは次の通りです。
vはバージョンです。今のところ1.0だそうです。
keyには自分のAPI Keyをセットします。
qには検索語をセットします。日本語のときはURLエンコードする必要があります。また「hl=ja」を付けるとよいでしょう。
具体的な使い方は後述します。 (さらに…)

PHPでJSONを使う

PHPでJSONを使う場合について、まとめます。

前提

前提は次の通りとします。
太郎と次郎がいて、それぞれidとnameを持っています。
次郎には子供がいて(春子、夏子)、それぞれnameを持っています。 (さらに…)

「東京電力の電気使用状況 API」を使う

東京電力から電力の使用状況が公開されましたが、これをJSON形式で扱えるAPIを公開しているサイトがありました。
東京電力の電気使用状況 API

これを試してみます。
JSON形式なのでJavaScriptで簡単に使うことができます。
データ例は次の通りです。

{"hours":[2990,2850,2770,2710,2700,2830,3100,3350],"capability":3850,"updated":"2011-03-25 08:05:00"}

hoursは午前0時から1時間毎の電力です。現時点までの情報が配列で得られます。単位は万キロワット。
capabilityは電力の最高限度です。
updatedは更新時刻です。

サンプル

サンプルは次の通りです。
なおJavaScriptの部分についてはjQueryを使っています。

HTML
<html>
<body>
<div id="main"></main>
</body>
</html>
JavaScript
var td = new Date();
var ymd = td.getFullYear() * 10000 + (td.getMonth() + 1) * 100 + td.getDate();
$.getJSON("http://denki.cuppat.net/data/" + ymd + ".json", function(json){
    $("#main").append("<p>" + td.getDate() + "日</p>");
    var hrs = json.hours;
    var cap = json.capability;
    var upd = json.updated;
    $("#main").append("<ul>");
    var temp;
    for(var i = 0 ; i < hrs.length ; i++){
        temp = i + "時 " + hrs[i] + "万kW (" + Math.floor(hrs[i] * 100 / cap) + "%)";
        $("#main ul").append("<li>" + temp + "</li>");
    }
    $("#main").append("<p>" + upd.replace(/.* (..):(..):.*/,"$1:$2 更新")+"</p>");
});

はてなハイクとTwitterのAPIの違い

はてなハイクのAPIはTwitterと互換性があるとのこと。
私はJavaScriptではてなハイクとTwitterの過去の投稿を抽出しているのですが、確かに同じコードで動きます。

しかし若干、異なる点があるので、書いておきます。
(さらに…)

JSONに関するメモ

JSON形式のデータは次のような文字列で表される。

[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}]

JavaScriptではそのまま配列変数として使える。
※この場合は2次元の配列となる。

recs=[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}];
alert(recs[1]["name"]);

このようにすると「satou」と表示される。
※0番目からカウントしたときの1番目の「name」である「satou」が表示される。

JSON形式のデータが外部ファイルのときは次のようにする。
※この例では外部ファイルは「test.json」である。

req = new ActiveXObject("Microsoft.XMLHTTP");
req.open("GET","test.json",false);
req.send();
text=req.responseText;
recs=eval(text);

ここでポイントはevalを使うことである。
単に「recs=text」としてしまうと

recs='[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}]';

と同じことになり、文字列として読み込んでしまう。
evalを使うとJavaScriptで使える形式に変換してくれる。

JSONはXMLよりもシンプルであり、JavaScriptにおいてはCSVよりも簡単に扱える。

text="1,suzuki;2,satou";

を配列に読み込むには

recs=new Array();
lines=text.split(";");
for(i=0;i&lt;lines.length;i++){
    recs[i]=lines[i].split(",");
}

のような手順が必要である。
JSONならば

text='[{"id":"1","name":"suzuki"},{"id":"2","name":"satou"}]';
recs=eval(text);

で済んでしまう。

JSON形式のデータは途中に改行が入っていても構わない。また入れ子にすることもできる。

[
    {"id":"1","name":"suzuki"},
    {"id":"2","name":"satou"},
    {"id":"3","name":"yamada",
        "kodomo":{"namae":"ichiro","age":"5"}
    }
]

このような書き方ができる。

recs[2]["kodomo"]["namae"]

とすると「ichiro」が取得できる。
また

recs[2].kodomo.namae

と書いても取得できる。


タグ

カテゴリー

最近の投稿

最近のコメント

固定ページ

アーカイブ

stabucky

写真

メタ情報