@JSON

@JSON

@フォロワー #0

[PHP]PHPでHTTP POSTされたJSON本文を受け取る方法について @Post @JSON @php

iQi @回答 • 2015-05-28 11:59 • @フォロワー #1 • 1 回答 • 3609 Views

Swiftで面倒なJSONの取り扱いを10倍便利にするSwiftyJSONについて @JSON @swift

lujian 質問投稿 • 2015-05-27 14:06 • @フォロワー #1 • 0 回答 • 1564 Views

PHPでJSONをオブジェクト毎にアクセスする方法について @JSON @php @code

Lubo @回答 • 2014-05-08 18:30 • @フォロワー #3 • 2 回答 • 3266 Views

PHPで応答をJSON形式で返す方法について @JSON @php @code

Lubo @回答 • 2014-05-08 18:22 • @フォロワー #3 • 2 回答 • 3304 Views

さらに...
1

{ 賛成 }: Lubo

PHPでJSON形式を出力する方法です。まずは、連想配列に項目を追加しておき、表示します。
{{{
// 連想配列を生成
// 表示内容
// {
// "name":"アイスケット",
// "address...

すべて表示する »
PHPでJSON形式を出力する方法です。まずは、連想配列に項目を追加しておき、表示します。
{{{
// 連想配列を生成
// 表示内容
// {
// "name":"アイスケット",
// "address":"神奈川県",
// "work":{
// "program":"PHP",
// "design":"CSS",
// "database":"MySQL"
// }
// }
$jsonArray = array(
'name' => 'アイスケット',
'address' => '神奈川県',
'work' => array(
'program' => 'PHP',
'design' => 'CSS',
'database' => 'MySQL'
)
);
}}}

// 生成した連想配列からJSON形式に変換して、表示
echo json_xencode($jsonArray);
json_xencodeという関数は別途定義した関数です。PHP5.3でも利用できるように記述したものです。

以下の関数は「オープンソースこねこね」様のサイトを参考にさせて頂きました。ありがとうございます。

{{{
/**
* ----------------------------------------------------------
* PHP5.4からでないと対応していないUnicodeアンエスケープをPHP5.3でもできるようにしたラッパー関数
* @param mixed $value
* @param int $options
* @param boolean $unescapee_unicode
* ----------------------------------------------------------
*/
function json_xencode($value, $options = 0, $unescapee_unicode = true)
{
$v = json_encode($value);

if ($unescapee_unicode) {
$v = unicode_encode($v);
// スラッシュのエスケープをアンエスケープする
$v = preg_replace('/\\\\\//', '/', $v);
}

return $v;
}

/**
* ----------------------------------------------------------
* Unicodeエスケープされた文字列をUTF-8文字列に戻す。
* 参考:http://d.hatena.ne.jp/iizukaw/20090422
* @param unknown_type $str
* ----------------------------------------------------------
*/
function unicode_encode($str)
{
return preg_replace_callback("/\\\\u([0-9a-zA-Z]{4})/", "encode_callback", $str);
}

function encode_callback($matches) {
return mb_convert_encoding(pack("H*", $matches[1]), "UTF-8", "auto");
}
}}}

json_xencode関数を定義しておけば、連想配列がそのままJSON形式で出力できるので非常に便利です。JSONというと難しく感じてしまう方もいるかもしれませんが、この関数を利用すれば特に意識することなく利用できると思います。
1

{ 賛成 }: Lubo

この内容をresponse.jsonというファイルを作って、ファイルの内容を以下のようにしておきます。
{{{
response.json

{
"name":"アイスケット",
"addres...

すべて表示する »
この内容をresponse.jsonというファイルを作って、ファイルの内容を以下のようにしておきます。
{{{
response.json

{
"name":"アイスケット",
"address":"神奈川県",
"work":{
"program":"PHP",
"design":"CSS",
"database":"MySQL"
}
}
}}}

次にPHPですが、先ほどのresponse.jsonと同じフォルダにPHPファイルを作ってください。

{{{
<?php
// ファイルからJSONを読み込み
$json = file_get_contents("response.json");

// 文字化けするかもしれないのでUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

// オブジェクト毎にパース
// trueを付けると連想配列として分解して格納してくれます。
$obj = json_decode($json, true);

// パースに失敗した時は処理終了
if ($obj === NULL) {
return;
}

// 表示
// アイスケット
echo $obj['name'];

// 表示
// PHP
echo $obj['work']['program'];
?>
}}}
上記の例は連想配列でパースしたものですが、オブジェクト形式のまま返す方法もあります。先程と違うのはjson_decode関数にtrueを付けないところと、オブジェクトへのアクセスが波括弧となるところです。
{{{
<?php
// ファイルからJSONを読み込み
$json = file_get_contents("response.json");

// 文字化けするかもしれないのでUTF-8に変換
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');

// オブジェクト毎にパース
// trueを付けないとオブジェクトとしてアクセスして格納してくれます。
$obj = json_decode($json);

// パースに失敗した時は処理終了
if ($obj === NULL) {
return;
}

// 表示
// アイスケット
echo $obj->{'name'};

// 表示
// PHP
echo $obj->{'work'}->{'program'};
?>
}}}
0

{ 賛成 }:

JSONを本文にPOSTリクエストを投げることが増えてきた
{{{
HTTP/1.1
Content-Type:application/json ###<-- jsonになっている
}}}
で直接JSONを本文に投げてくるクライアントが増えてきている...

すべて表示する »
JSONを本文にPOSTリクエストを投げることが増えてきた
{{{
HTTP/1.1
Content-Type:application/json ###<-- jsonになっている
}}}
で直接JSONを本文に投げてくるクライアントが増えてきていることを知りましました。
HTTPのPOSTと言えば、form urlencodedですが、JSONを本文に入れることがあります。
HTTPヘッダサンプル(JSON版)
{{{
HTTP/1.1
User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.8.4) Presto
Host: example.com
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Connection: Keep-Alive
Content-Type:application/json ###<-- jsonになっている

{a=1,b=2}
}}}
通例であれば、application/x-www-form-urlencodedです
通常であれば、以下のように、key=value&key2=valueです。
{{{
HTTP/1.1
User-Agent: Opera/9.80 (Macintosh; Intel Mac OS X 10.8.4) Presto
Host: example.com
Accept-Encoding: gzip, deflate
Cache-Control: no-cache
Connection: Keep-Alive
Content-Type:application/x-www-form-urlencoded

name=a%3D1  ### => {a=1,b=2}をURLエンコードしたもの
}}}
jsonを本文に入れる
通常のようにURLエンコードせずに、直接JSON文字列をサーバーに送ります。
{{{
Content-Type:application/json ###<-- jsonになっている

{a=1,b=2}
}}}
form urlencodedではなく、JSONを本文に入れて送るのでした。
phpだと$_POST変数が空っぽ
Content-Type:application/json で送信されると、key=valueが無いので当然ながら、$_POST変数が空っぽになります。
送られたJSON本文の受け取り方
そこで、HTTPリクエスト本文にphp://input の fopen wrapperを使って直接ストリームにアクセスを試みます
{{{
<?php

$json_string = file_get_contents('php://input'); ##今回のキモ

echo $json_string;
$obj = json_decode($json_string);//→json object
$arr = json_decode($json_string,true);//→php array
var_dump($obj);
}}}
とすれば受け取ることができます。

簡単ですね。こうすれば、POST変数名に縛られなくて便利ですね。
さらに...
JSON とは、「JavaScript Object Notation」の略で「ジェイソン」といいます。
 
テキストフォーマットの一種です。シンプルで軽量です。
JSON は、null、真偽値、数値、文字列、配列、オブジェクト(連想配列)のデータを、文字列で表現できます。
配列とオブジェクト(連想配列)は、ネスト(入れ子)構造で表現する事ができます。

ECMAScript 系の言語であれば、「オブジェクト(ECMAScript)」と「JSON 文字列」の相互変換を、簡単に行うことができます。
他言語で扱う場合でも、XML と比べて比較的仕様が簡単なので、導入が容易でしょう。

@概要

JSON とは、「JavaScript Object Notation」の略で「ジェイソン」といいます。
 
テキストフォーマットの一種です。シンプルで軽量です。
JSON は、null、真偽値、数値、文字列、配列、オブジェクト(連想配列)のデータを、文字...   ...

@関連

@達人

iQi

@ 2賛成, 0 感謝

@フォロワー #0