php_PHP チュートリアルで json データを解析するための 2 つのメソッドの例

WBOY
リリース: 2016-07-20 11:07:47
オリジナル
868 人が閲覧しました

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;

switch (gettype($arg))

{
case ' array':
foreach ( $arg AS $i => $v)
{
if (!is_numeric($i))
{
$numeric = false;
break;
}
}

if ($numeric )

{
foreach ( $arg AS $i => $v)
{
if (strlen($s) > 0)
{
$s .= ',';
}
$s .= $this->encode( $arg[$i]);
}

$returnValue = '[' . $s . ']';

}
else
{
foreach ($arg AS $i => $ v)
{
if (strlen($s) > 0)
{
$s .= ',';
}
$s .= $this->encode($i) . $ this->encode( $arg[$i]);
}

$returnValue = '{' . $s . '}';

}
break;

case 'object':

foreach (get_object_vars($ arg) AS $i = > $v)
{
$v = $this->encode($v);

if (strlen($s) > 0)

{
$s .= ', ';
}
$ s .= $this->encode($i) . $v;
}

$returnValue = '{' . $s . 'integer':

case 'double':
$returnValue = is_numeric($arg) ? (string) $arg : 'null';

break;


case 'string':
$returnValue = '"' . strtr ($arg, array(
「r」=>「n」、「b」=>「b」、

「f」 ', '' => '"' => '"',

"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;
}

function decode($text,$type=0) //デフォルト type=0 return obj, type=1 return array

{
if (empty($text))
{

return '';

}
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);

return addedlashes_deep_obj($result);

}

/**
* 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 == '"')
{

while ($this->next() !== null)

{
if ($this->ch == '"')
{
$this->next();

return $ s;
}

elseif ($this->ch == '')

{
switch ($this->next())
{
case 'b':
$s .= 'b';
Break;

case 'f':
$s .= 'f';

break;


case 'n':
$s .= 'n';

break;


case 'r':
$s .= 'r';

break;


case 't':
$s .= 't';

break;


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 ''':

$s .= ''' ;

break;
default:
$s .= $this->ch;
}
}
else
{
$s .= $this->ch;
}
}
}

$this- >error('不正な文字列');
}

/**

* ハンドルレス配列
*

* @access private

*
* @return void
*/
function arr()
{
$a = array();

if ($this->ch == ' [')
{
$this->next();

if ($this->ch == ']')
{
$this->next();

return $a;
}

while (isset($this->ch))

{
array_push($a, $this->val());

if ($this->ch == ']')
{
$this->next();

return $a;

}

elseif ($this->ch != ',')

{

break;

}

$this->next ();

}

$this->error('Bad array');

}

}

/**
* オブジェクトを処理します
*

* @access public

*
* @return void
*/
function obj()
{
$k = '';
$o = new StdClass();

if ($this->ch == '{')
{
$this->next();

if ($this->ch == '} ')
{
$this->next();

return $o;
}

while ($this->ch)

{
$k = $this->str();

if ($this->ch != ':')
{
break;

}


$this->next();
$o->$k = $this->val();

if ($this->ch == '}')

{
$this->next();

return $o;
}
elseif ($this->ch != ',' )

{

break;
}

$this->next();
}
}

$this->error('不正なオブジェクト');
}

/**

* オブジェクトを処理します
*

* @access public

*
* @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);


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/444936.html技術記事 phpjsonデータデータ二型解析方法 twitter などの最も人気のある Web サービスを提供するためのデータ一样、它总是能够知道 どのように API データを解析するか、さまざまな転送格式...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!