XML を JSON に変換するサービス - ベータ版を公開
JavaScript 2.0 支援ツール「XML 2 JSON service」って何?
XML を JSON に変換するサービスです。この技術を用いることで、
- クロスドメイン制限を超えて JSON 形式で XML 形式のデータを利用することが可能となります。
- JSON は XML と比較して JavaScript 上で非常に扱いやすいため、コツを掴めば簡単に自分のサイトで利用できます。
既に幾つかのサイトで実装されていますが、不特定多数の方にサービス提供するために負荷対策を施し、XML 2 JSON service ベータサービスを公開することにしました。
最近良く聞く Ajax とは何が違うの?
最近、流行りまくっている Web 2.0 と呼ばれるものの基礎技術の1つとして Ajax があげられます。Ajax は大変便利な技術なのですが、セキュリティの観点から自ドメインへのアクセスしか許可されていません(正確には、XMLHTTPRequest のクロスドメイン制限)。
Flash にも同じようにクロスドメイン制限がありますが、crossdomain.xml にて相手側のリクエストを許可する仕組みがありますが Ajax にはコレに相当する仕組みがありません。
そこで注目されはじめた技術が JSON (JavaScript Object Notation) と呼ばれる技術です。JSON は JavaScript 上でそのまま使えるデータ形式でクロスドメイン制限がないという特徴を持ちます。したがって、別ドメインで配布されている JSON を自ドメイン内から JavaScript レベルでデータを利用することができます。
JSON についてもう少し知りたい
Collection & Copy - JSON入門によれば、
JSONは2つの構造を基にしています。
- 名前/値のペアの集まり。様々な言語で、これはオブジェクト、レコード、構造体、ディクショナリ、ハッシュテーブル、キーのあるリスト、連想配列として実現されています。
- 値の順序付きリスト。ほとんどの言語で、これは配列として実現されています。
動作環境は?
サーバ側で必要なものは、JavaScript が記述可能な環境です。無料系ブログサービスでじゃ JavaScript を記述できないようになっているものもあります。そのような環境ではご利用頂けません。
クライアント環境として、閲覧可能なブラウザの検証は以下の通りです。Opera 系がNGなのでご注意下さい。
ブラウザ | 動作検証 |
---|---|
Win IE | ○ |
FireFox | ○ |
Opera | × |
Safari | ? |
利用許諾
- 無料でお使い頂けます。ただし、当サイトの xml2json サーバが各サービスへのアクセスを中継する形となりますので、Yahoo! 検索Webサービスや Google Web API 等のようにアクセス数制限があるサービスに対しては、ご利用をお控え下さい。すぐにアクセス数制限を超えてアクセス不可になると思います。
- あまりに容量の大きい XML は破棄して処理を中断する仕組みが実装されています。
- 一定期間、結果をキャッシュします。最新の動きを追うような用途には期待した結果が得られません。
- 負荷の問題等で、突然サービスを終了する可能性もあります。ご了承下さい。
導入方法( xml2json の利用方法)は?
xml2json サービスは REST API で行うことができます。必要なパラメータを GET で付加します。結果は JSON で取得できます。(サンプル:Livedoor Weather Web Service)
URL | update.2020.11.9: SSL 対応のためURLが変更になりました https://www.drk7.jp/App/xml2json/ |
Method | GET |
Parameters | url: XML を結果として返す URL (URL Encoded) var: 結果を格納する JavaScript 内で定義したオブジェクト名 |
Returns | JSON |
XML2JSON service を利用した簡単なサンプル
Livedoor Weather Web Service を利用して、東京の天気予報をサイトに貼り付ける demo
ソースファイルは以下のとおり。
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>xml2json sample</title> </head> <body> <div>結果(UTF8):<span id="id_result"></span></div> <div id='searching' style='display:none'>now searching...</div> <script type="text/javascript"> var city = '63'; var day = 'tomorrow'; var name = 'lwws1'; var proxy = 'https://www.drk7.jp/App/xml2json/'; var lwws1 = {}; lwws1.init = function() { var script = document.createElement('script'); script.charset = 'UTF-8'; script.src = proxy + 'var=' + this.name + '&url=' + escape('http://weather.livedoor.com/forecast/webservice/rest/v1?city=' + this.city + '&day=' + this.day); document.body.appendChild(script); } lwws1.onload = function(data){ var d = document.getElementById('id_result'); d.innerHTML = data["location"]["pref"] +' '+ data["location"]["city"] +' '+ data["telop"] +' '+ '<img src="' + data["image"]["url"] + '"><br>'+ data["description"]; } var old = window.onload; window.onload = (typeof old != 'function') ? lwws1.init : function(e) { old(e); return lwws1.init(e); }; </script> </body> </html>
結果は以下のように表示されると思います。
なんて具合に、ちょっとした JavaScript を埋め込むだけで、お天気情報を表示できたりします。当サイトで公開している MTWeather と違い、MovableType 以外の方でもご利用頂けます。
update 06.02.20 / utf8 以外の XML に対応
update 06.03.11 / Sampleコードを変更
- 参考:XML 2 JSON serviceを使ってFlickr Badgeを作る - Ogawa::Memoranda
コメントやシェアをお願いします!
boos
先の投稿した文字列リテラルの途中で改行されてしまうという件についてです。
これはJSONデータ部分が大きくなった場合に、スクリプトエンジンの中でパースするときに、ある長さで、内部的に改行されてしまう様です。
そこでJISONデータ部分のJSONオブジェクトの区切りのいいところで改行して出力してもらえると、たぶん解決します。
boos
試してみました。
JSONとしては不正である、文字リテラルの途中で改行が入ってしまう現象が見受けられます。
もとのxmlを確認しましたが、htmlデータで問題なくエスケープされており、また改行も入っていません。
jojo
私も下のアプリコットさんと同じ状況で、
forecastdateを表示すると、名古屋以外は、その日の日付データがでません。
なので、天気予報が全く当たらない状態です。
livedoorが悪いのでしょうか。。
東京(63)に関してはtodayでやって、
現在28日ですが、25日が表示されてしまいます。
アプリコット
XML2JSON service を利用させて頂いております。
このサービスが使えて大変感謝しております。
ひとつ質問があります。
本日(19日)の天気予報を表示すると内容が17日の天気予報が表示しています。
LivedoorのXMLの内容は本日の内容を表示しますが、なぜでしょうか?
ちなみに地区のコード(city)は73です。
教えてください。よろしくお願い致します。
tanabe
いつも「XML2JSON service」を使わせていただいております。
そこでお尋ねしたいことがあります。
時々表示されなくなる場合があります。
これは、
> アクセス数制限があるサービスに対しては、ご利用をお控え下さい。
> すぐにアクセス数制限を超えてアクセス不可になると思います。
という内容に該当するものなのでしょうか?
また、1日どのくらいのアクセスでアクセス不可になりますか?
1日の最大アクセス数を教えていただけますでしょうか?
masarizm
こんにちは。クロスドメインでのRSS読み込みで探し当てました。
とても便利です!がんばってください!
ちなみにIntelMacを使ってますが、FireFoxとSafari3.0.4では動作しました。
ヨンシマイ
こちらの記事を参考に
大阪の天気予報をブログに載せました。
ありがとうございます。
最高気温と最低気温も追加させていただきましたが、
問題なかったでしょうか?
便利な機能ですね。ありがとうございました。
熱湯? コマーシャル考
こんにちは、昨日こちらにコメントさせて頂いたみんなの儲かるCM分析です。
Youtube.APIのXMLのリストのVideo件数が1件しか無い場合や1件のみ切り出そうとした場合と
リストのVideo件数が複数件ある場合とでdrk7さんを通したときのJSONの形が違うようです。
10件切り出したときはvideoの下にid階層があるのに対して、
1件切り出したときはvideoの下にid階層がありません。
これでちょっと悩みましたが、問題は解決しましたので、
http://netoureseach.blog92.fc2.com/
に実装してみました。
以前と見た目は同じなんですが(^^;
良いサービスをどうもありがとうございます。
みんなの儲かるCM分析
はじめまして、とても良いサービスですね。
ちょっと使わせて頂こうと思いいろいろやっていました。
YoutubeからAPIをdrk7さんを通して引っ張ってきたんです。
ところが、Youtube.APIのXMLのリスト件数が1件しか無い場合や1件のみ切り出そうとした場合にJSONを受け取れないようなのです。
(両方共ブラウザでXMLが出力されているか確認済み)
Youtube.APIのXMLのリスト件数が複数ある場合にはJSONを受け取れるので、
私のJavaScriptに問題があるのかもしれませんが、
ちょっとこちらでは原因がわかりません。
http://netoureseach.blog92.fc2.com/file/ytfr.html
Youtube.APIのXMLのリスト件数が1件しか無い場合や1件のみ切り出そうとした場合
なにか特別な方法があるのでしょうか?
hey
はじめまして。このサービスに感謝しております!
差し出がましくも提案があるのですが、コールバックとしてvar.onload(responseJSON)という関数を呼び出していますが、特定のコンテキストから呼び出せるようにするとオブジェクト指向で書いている時に便利だと思います。
var.onload.call(loader,responseJSON)と呼び出すイメージです。(varと同じようにloaderはURLのQueryStringで設定できるようにする)
call関数がどの程度ブラウザ互換なのか知らないのですが、オプションとしてあれば便利だと思います。
ただの思い付きですので・・・。突然に失礼しました。
drk
suVene さん>error 時もJSONPで結果を返すように変更しました。仕様というかそこまでよく考えてなかっただけです・・・(^^ゞ
キャッシュは現行3時間ですがサーバの負荷次第で適当に変更する可能性があります。
suVene
はじめまして。国内ではあまり XML2JSON をウェブサービスとして提供されているところがないので、利用価値は高いと思います。
お伺いしたいことが2点ほどあります。
1) キャッシュ時間は何分くらいでしょうか?
2) XMLorRSSがエラーだった場合のResponseが、JSONPの形ではなく、素のJSONなので、Scriptとしてimportするとエラーになるのですが意図した動作なのでしょうか。
以上です。
drk
sharlandさん>こちらこそ、どうぞ宜しくお願い致します。
sharland
このxml2json サービスいいですね。REST API で行うことができるというのも○かと
思います。
Ajaxのクロスドメイン問題。いろんな回避策はあるものの、どれも迂回ルートで釈然と
しませんでした。
それと、XMLそのものがシステムにとっても利用者にとっても使いやすいとは言いがたいので、
JSONは注目していました。
#設定ファイルのXML化が流行していて、設定ファイルが肥大化してわけわかん
#なくなりますよね。
今、Ajaxの書籍を執筆中なのですが、クロスドメイン問題の記事を書いていて、この
xml2jsonサービスにいきつきました。この紹介をここのURLとあわせて紹介させて
もらってもいいでしょうか。
ご検討をおねがいいたします。
st
ホスティングは大変かもしれませんが、期待しています。
ちなみにJSON with Padding(jsonp)のような形式のコールバックに対応することは不可能でしょうか?最近のYahooやDel.icio.usはこの形式を採用してるみたいです。
http://ajaxian.com/archives/jsonp-json-with-padding
AUSGANG SOFT
いろんなことに応用がききそうなサービスですね。
Operaでの表示ですが
lwws1.onload = function disp(data){
というように関数名をつけて、スクリプトの動的追加の前に宣言してやると、動作しました。
それと、サンプルソースの中の
LWWS(city, day, name, proxy);
は、必要ないかと。
あと、Javascript 2.0 は将来バージョン2.0が出た時にややこしそうです。
Javascript Programminng 2.0 ではいかがでしょうか?
細かいつっこみですみません。
しのぽん
こんにちは
自分のHPに天気予報を載せたいと思い、こちらに辿り着きました。
そもそもXMLがわからなかったので本を買いJavascriptでDOMと言うの
を使い、上手く行ったと思っていたら、サーバーにあげたとたんに
アクセス制限(外部ファイルが見られない)にかかり泣いていました。
そんなわけで途方にくれていましたが、こちらの「XML2JSON service」
を使って上手く表示させられることが出来ました。
XMLの各要素にも簡単にアクセス出来る作りのようでとても助かります。
これからもどうかよろしくお願いします。