2008年5月25日日曜日

JSON と JSONP

JSON と JSONP


●JSON(JavaScript Object Notation:JavaScriptオブジェクト表記法)


JavaScriptにおけるオブジェクトの表記法をベースとした軽量なデータ記述言語です。
JSONは単純であるので、特にAjaxの分野で利用が広がりつつあります。
<---- ウィキペディア(Wikipedia)より。


【JSONの使用例】


json.html



<html>
<head>
<title>json test</title>
<script language="JavaScript">
<!--
//XMLHttpRequestオブジェクト生成
function createHttpRequest()
{
//Win ie用
if(window.ActiveXObject){
try {
//MSXML2以降用
return new ActiveXObject("Msxml2.XMLHTTP")
} catch (e) {
try {
//旧MSXML用
return new ActiveXObject("Microsoft.XMLHTTP")
} catch (e2) {
return null
}
}
} else if(window.XMLHttpRequest){
//Win ie以外のXMLHttpRequestオブジェクト実装ブラウザ用
return new XMLHttpRequest()
} else {
return null
}
}
//ファイルにアクセスし受信内容を確認します
window.onload = function()
{
//XMLHttpRequestオブジェクト生成
var xmlHttpObj = createHttpRequest()

//open メソッド
xmlHttpObj.open( 'GET', 'http://localhost/ajax/test/json.php' , true )

//受信時に起動するイベント
xmlHttpObj.onreadystatechange = function()
{
//readyState値は4で受信完了
if (xmlHttpObj.readyState==4)
{
//コールバック
mkHtml(xmlHttpObj)
}
}

//send メソッド
xmlHttpObj.send( '' )
}

//コールバック関数 ( 受信時に実行されます )
function mkHtml(obj)
{
//レスポンスを取得
res = obj.responseText
}
//レスポンスされた文字列をJavaScriptとして実行
eval(res)

//受け取ったJSONを使ってHTML文字列を作成
var html = "名前: " + jsonData.Name + "
住所: " + jsonData.Addr

//DIV へ出力
document.getElementById('list').innerHTML = html
}

//-->
</script>
</head>

<body>
<!-- ここへ出力 -->
<table width=800>
<tr bgcolor="#cccccc">
<td id="list">名前<br>住所</td>
</tr>
</table>
</body>
</html>



json.php



<?php

$fn = "./json.txt";

if(is_file($fn)){
$fhandle = fopen($fn, "r");
while(feof($fhandle) == FALSE){
$str = fgets($fhandle);
echo $str;
}
} else {
print "file open error:".$fn;
}
?>



json.txt




jsonData =
{
"Name":"Tsuchida",
"Addr":"Chiba,Japan"
}


結果表示


json.htmlは、以下の結果を表示します。





名前: Tsuchida
住所: Chiba,Japan



●JSONP(JSON with Padding)



JSON のデータフォーマットにちょっとした記述を加えて JavaScript の関数を呼び出せるようにしたものです。

「クロスドメインの制約」からXMLHttpRequest を使う方法では読込先が他ドメインの場合は使ません。

そこでデータを JSONP の形式にして JavaScriptのソースとしてインクルードしてしまうわけです。

また JSONP は関数呼び出しの形式になっているので,その関数の処理を別に記述することでコールバック関数のように機能します。

<---- [鏡] 入門 JSON 3 -- JSONP とコールバック関数より。


【JSONPの使用例】


jsonp.html




<html>
<head>
<title>jsonp test</title>
<script>
<!--
window.onload = function(){
var req_url = "http://localhost/ajax/test/jsonp.php";
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = req_url;
document.getElementsByTagName("head")[0].appendChild(script);
}

function jsonpData(obj){
var name = obj.Name;
var addr = obj.Addr;
var html = "名前: "+ name +"<br>住所: "+ addr;
document.getElementById("list").innerHTML = html;
}
-->
</script>
</head>

<body>
<!-- ここへ出力 -->
<table width=800>
<tr bgcolor="#cccccc">
<td id="list">名前<br>住所</td>
</tr>
</table>

</body>
</html>


jsonp.php




<?php

$fn = "./jsonp.txt";

if(is_file($fn)){
$fhandle = fopen($fn, "r");
while(feof($fhandle) == FALSE){
$str = fgets($fhandle);
echo $str;
}
} else {
print "file open error:".$fn;
}
?>


jsonp.txt




jsonpData(
{
"Name":"Tsuchida",
"Addr":"Chiba,Japan"
}
);

結果表示


jsonp.htmlは、json.htmlと同じく以下の結果を表示します。






名前: Tsuchida
住所: Chiba,Japan


最後に


JSON と JSONP は似て非なるもの。

JSON はオブジェクトの表記法であり、JSONP は(引数としてJSONを使用するものの)

「関数をコールするソースの生成」です。

似ているのは名称だけですね。


まあ、もっともJSONPが考えられた背景には、XMLHttpRequestの「クロスドメイン制約」があるので

両者が違うのも当り前なのでしょう。

0 件のコメント:

ただいま作業中

2022/04/13 MySTの翻訳環境作り サイドメニューをプログラムで変換可能にすること 作業の中心場所 – jupyter notebook : g:\jupyter\python pythonをwebでも可能に – g:\webapp\Doc-tools ...