php による json データの解析方法の 2 つの例
twitter などの最も人気のある Web サービスは、オープン API を通じてデータを提供しており、JSON、XML などの API データのさまざまな送信形式を解析する方法を常に知っています。
$json_string='{"id":1,"name":"php100.com","email":"phptutorial">admin@php100.com","interest":["wordpress"," php"]} ';
$obj=json_decode($json_string);
echo $obj->name; // foo を出力
echo $obj->interest[1]; // php
ecshop 分析を出力json クラス
if (!define('EC_CHARSET'))
{
define('EC_CHARSET', 'utf-8');
}
class JSON
{
var $at = 0;
var $ch = '';
var $text = '';
function encode($arg, $force = true)
{
static $_force;
if (is_null($_force))
{
$_force = $force;
}
if ($_force && EC_CHARSET == 'utf-8' && function_exists('json_encode'))
{
return json_encode($arg);
}
$returnValue = '';
$c = '' ;
$i = '';
$l = '';
$s = '';
$v numeric = true;
{
case ' array':
foreach ( $arg AS $i => $v)
{
if (!is_numeric($i))
{
$numeric = false;
break;
}
}
{
foreach ( $arg AS $i => $v)
{
if (strlen($s) > 0)
{
$s .= ',';
}
$s .= $this->encode( $arg[$i]);
}
}
else
{
foreach ($arg AS $i => $ v)
{
if (strlen($s) > 0)
{
$s .= ',';
}
$s .= $this->encode($i) . $ this->encode( $arg[$i]);
}
}
break;
foreach (get_object_vars($ arg) AS $i = > $v)
{
$v = $this->encode($v);
{
$s .= ', ';
}
$ s .= $this->encode($i) . $v;
}
case 'double':
$returnValue = is_numeric($arg) ? (string) $arg : 'null';
case 'string':
$returnValue = '"' . strtr ($arg, array(
「r」=>「n」、「b」=>「b」、
"x00" => 'u0001', "x02" => 、「x03」=>「u0003」、「x04」=>「u0005」、「x07」=>「u0007」 ',
"x08" => 'b'、"x0b" => 'u000b'、"x0e" => 'u000e'、
"x0f" => 'u000f'、"x10" => 'u0010'、"x11" => 'u0012'、"x13" => ; 'u0014'、"x15" => 'u0015'、"x16" => 'u0017'、"x18" => 'u0018 '、"x19" => ; 'u0019'、"x1a" => 'u001a'、"x1b" => 'u001c'、"x1d" => > 'u001e',
"x1f" => 'u001f'
)) '"';
break;
case 'boolean':
$returnValue = $arg?'true ':'false';
Break;
default:
$returnValue = 'null';
}
return $returnValue;
}
{
if (empty($text))
{
}
elseif (!is_string($text))
return false;
}
if ( EC_CHARSET === 'utf- 8' && function_exists('json_decode'))
{
return $this->addslashes_deep_obj(json_decode(stripsチュートリアルまつげ($text),$type));
}
$this->at = 0;
$this->ch = '';
$this->text = strtr(stripslashes($text), array(
"r" => '', " n" => ''、"t" => ''、"b" => ''、
"x00" => ''、"x01" => ''、"x02" => ; ''、"x03" => ''、"x05" => ''、
"x08" => ''、"x0c" => ''、
"x0f" => =>、"x11" =>"、"x13" =>、"x15" => ', "x16" => '',"x17" => '', "x19" => '',
; x1b" => ''、"x1c" => ''、"x1d" => ''、"x1e" => ''、
"x1f" => ''
));
$this->next();
$return = $this->val();
$result = empty($type) ? $return : $this->object_to_array($return);
}
/**
* PHP_ERROR をトリガーします
* @access private
* @param string $m エラー メッセージ
*
* @return void
*/
関数エラー($m)
{
trigger_error($m . ' オフセット ' . $this->at . ' . $this->text, E_USER_ERROR);
}
/**
* JSON 文字列の次の文字を返します
* @access private
*
* @return string
*/
function next()
{
$this-> ;ch = !isset($this->テキスト{$this->at}) ? '' : $this->text{$this->at};
$this->at++;
return $this->ch;
}
/**
* 文字列を処理します
* @access private
*
* @return void
*/
function str()
{
$i = '';
$s = '';
$t = '';
$u = '';
if ($this->ch == '"')
{
{
if ($this->ch == '"')
{
$this->next();
return $ s;
}
{
switch ($this->next())
{
case 'b':
$s .= 'b';
Break;
case 'f':
$s .= 'f';
case 'n':
$s .= 'n';
case 'r':
$s .= 'r';
case 't':
$s .= 't';
case 'u':
$u = 0;
for ($i = 0; $i {
$t = (整数) sprintf('%01c', hexdec($this->next()));
if (!is_numeric($t)) {
break 2;
$u = $u * 16 + $t;
}
$s .= chr($u);
break;
case ''':
break;
default:
$s .= $this->ch;
}
}
else
{
$s .= $this->ch;
}
}
}
$this- >error('不正な文字列');
}
* ハンドルレス配列
*
*
* @return void
*/
function arr()
{
$a = array();
if ($this->ch == ' [')
{
$this->next();
if ($this->ch == ']')
{
$this->next();
return $a;
}
{
array_push($a, $this->val());
if ($this->ch == ']')
{
$this->next();
return $a;
}
{
break;}
$this->next ();
}
$this->error('Bad array');
}}
/**
* オブジェクトを処理します
*
*
* @return void
*/
function obj()
{
$k = '';
$o = new StdClass();
if ($this->ch == '{')
{
$this->next();
if ($this->ch == '} ')
{
$this->next();
return $o;
}
{
$k = $this->str();
if ($this->ch != ':')
{
break;
$this->next();
$o->$k = $this->val();
{
$this->next();
return $o;
}
elseif ($this->ch != ',' )
break;
}
$this->next();
}
}
$this->error('不正なオブジェクト');
}
* オブジェクトを処理します
*
*
* @return void
*/
関数 assoc()
{
$k = '';
$a = array();
if ($this->ch == '<')
{
$this->next() ;
if ($this->ch == '>')
{
$this->next();
return $a;
}
while ($this->ch)
{
$k = $this->str();
if ($this->ch != ':')
{
break;
}
$this->next();
$a[ $k] = $this->val();
if ($this->ch == '>')
{
$this->next();
return $a;
}
elseif ($this->ch != ',')
{
break;
}
$this->next();
}
}
$this->error('不正な連想配列');
}
/**
* 番号を処理します
*
* @access private
*
* @return void
*/
function num()
{
$n = '';
$v = '';
if ($this->ch == '- ')
{
$n = '-';
$this->next();
}
while ($this->ch >= '0' && $this->ch <= '9')
{
$n .= $this->ch;
$this->next();
}
if ($this->ch == '.')
{
$ n .= '.';
while ($this->next() && $this->ch >= '0' && $this->ch {
$ n .= $this->ch;
}
}
if ($this->ch == 'e' || $this->ch == 'E')
{
$n .= 'e';
$this->next();
if ($this->ch == '-' || $this->ch == '+')
{
$n .= $this->ch;
$this->next();
}
while ($this->ch >= '0' && $this->ch {
$n .= $this->ch;
$this->next();
}
}
$v += $n;
if (!is_numeric($v))
{
$this->error('不正な番号');
}
else
{
return $v;
}
}
/**
* 単語を処理します
*
* @access private
*
* @return mixed
*/
function word()
{
switch ($this ->ch)
{
case 't':
if ($this->next() == 'r' && $this->next() == 'u' && $this-> next() == 'e')
{
$this->next();
return true;
}
break;
case 'f':
if ($this->next() = = 'a' && $this->next() == 'l' && $this->next() == 's' && $this->next() == 'e')
{
$this->next();
return false;
}
break;
case 'n':
if ($this->next() == 'u' && $this->next( ) == 'l' && $this->next() == 'l')
{
$this->next();
return null;
}
break;
}
$this- >error('構文エラー');
}
/**
* ジェネリック値ハンドラー
*
* @access private
*
* @return mixed
*/
function val()
{
switch ($this->ch)
{
case '{':
return $ this->obj();
case '[':
return $this->arr();
case '<':
return $this->assoc();
case '" ':
return $this->str();
case '-':
return $this->num();
default:
return ($this->ch >= '0' && $this->ch num() : $this->word();
}
}
/**
* 指定されたオブジェクトのプロパティを再帰的に取得します
*
* @access private
*
* @return array
*/
function object_to_array($obj)
{
$_arr = is_object($obj) ? get_object_vars($obj) : $obj;
foreach ($_arr as $key => $val)
{
$val = (is_array($val) || is_object($val)) ? $this->object_to_array($val) : $val;
$arr[$key] = $val;
}
return $arr;
}
/**
* 変数内の特殊文字を再帰的にエスケープします
*
* @access public
* @param mix $value
*
* @return mix
*/
function addedlashes_deep( $value)
{
if (empty($value))
{
return $value;
}
else
{
return is_array($value) ? array_map('addslashes_deep', $value) :addslashes($value);
}
}
/**
* オブジェクトのメンバー変数または配列の特殊文字をエスケープします
*
* @access public
* @param mix オブジェクトまたは配列
* @author Xuan Yan
*
* @return mix オブジェクトまたは配列
*/
function addedlashes_deep_obj($obj)
{
if (is_object($obj) == true )
{
foreach ($obj AS $key =>$val)
{
$obj->$key =$this->> addedlashes_deep($val);
}
}
else
{
$obj = addlashes_deep($obj);
}
return $obj;
}
/**
* 変数内の特殊文字を再帰的に削除します
*
* @access public
* @param mix $value
*
* @return mix
*/
functionstripslashes_deep($value)
{
if (empty($value))
{
return $value;
}
else
{
return is_array($value) ? array_map('stripslashes_deep', $value) :tripslashes($value);
}
}
/**
* JSONで渡されたパラメータを変換します
*
* @param string $str
* @return string
*/
function json_str_iconv($str)
{
if (EC_CHARSET != 'utf-8 ')
{
if (is_string($str))
{
return ecs_iconv('utf-8', EC_CHARSET, $str);
}
elseif (is_array($str))
{
foreach ($str as $key => $value)
{
$str[$key] = json_str_iconv($value);
}
return $str;
}
elseif (is_object($str))
{
foreach ($str $key => $value)
{
$str->$key = json_str_iconv($value);
}
return $str;
}
else
{
return $str;
}
}
return $ str;
}
}
$string='{"email":"cc@126.com","content":"これは単なるテストです","type":"0","id" :"13","enabled_captcha":"0","captcha":"","rank":"5"}';
$json=new JSON();
$cmt = $json->json_str_iconv ($string); //文字转码
$cmt = $json->decode($cmt); //解コード
print_r($cmt);