PHP实现的json类实例
本文实例讲述了PHP实现的json类。分享给大家供大家参考。具体如下:
这里注意json_encode只有(PHP5>=5.2.0,PECLjson>=1.2.0)才有
<?php
/*vim:setexpandtabtabstop=4shiftwidth=4softtabstop=4:*/
/**
*ConvertstoandfromJSONformat.
*
*JSON(JavaScriptObjectNotation)isalightweightdata-interchange
*format.Itiseasyforhumanstoreadandwrite.Itiseasyformachines
*toparseandgenerate.ItisbasedonasubsetoftheJavaScript
*ProgrammingLanguage,StandardECMA-2623rdEdition-December1999.
*ThisfeaturecanalsobefoundinPython.JSONisatextformatthatis
*completelylanguageindependentbutusesconventionsthatarefamiliar
*toprogrammersoftheC-familyoflanguages,includingC,C++,C#,Java,
*JavaScript,Perl,TCL,andmanyothers.ThesepropertiesmakeJSONan
*idealdata-interchangelanguage.
*
*ThispackageprovidesasimpleencoderanddecoderforJSONnotation.It
*isintendedforusewithclient-sideJavascriptapplicationsthatmake
*useofHTTPRequesttoperformservercommunicationfunctions-datacan
*beencodedintoJSONnotationforuseinaclient-sidejavascript,or
*decodedfromincomingJavascriptrequests.JSONformatisnativeto
*Javascript,andcanbedirectlyeval()'edwithnofurtherparsing
*overhead
*
*AllstringsshouldbeinASCIIorUTF-8format!
*
*LICENSE:Redistributionanduseinsourceandbinaryforms,withor
*withoutmodification,arepermittedprovidedthatthefollowing
*conditionsaremet:Redistributionsofsourcecodemustretainthe
*abovecopyrightnotice,thislistofconditionsandthefollowing
*disclaimer.Redistributionsinbinaryformmustreproducetheabove
*copyrightnotice,thislistofconditionsandthefollowingdisclaimer
*inthedocumentationand/orothermaterialsprovidedwiththe
*distribution.
*
*THISSOFTWAREISPROVIDED``ASIS''ANDANYEXPRESSORIMPLIED
*WARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THEIMPLIEDWARRANTIESOF
*MERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSEAREDISCLAIMED.IN
*NOEVENTSHALLCONTRIBUTORSBELIABLEFORANYDIRECT,INDIRECT,
*INCIDENTAL,SPECIAL,EXEMPLARY,ORCONSEQUENTIALDAMAGES(INCLUDING,
*BUTNOTLIMITEDTO,PROCUREMENTOFSUBSTITUTEGOODSORSERVICES;LOSS
*OFUSE,DATA,ORPROFITS;ORBUSINESSINTERRUPTION)HOWEVERCAUSEDAND
*ONANYTHEORYOFLIABILITY,WHETHERINCONTRACT,STRICTLIABILITY,OR
*TORT(INCLUDINGNEGLIGENCEOROTHERWISE)ARISINGINANYWAYOUTOFTHE
*USEOFTHISSOFTWARE,EVENIFADVISEDOFTHEPOSSIBILITYOFSUCH
*DAMAGE.
*
*@category
*@packageServices_JSON
*@authorMichalMigurski<mike-json@teczno.com>
*@authorMattKnapp<mdknapp[at]gmail[dot]com>
*@authorBrettStimmerman<brettstimmerman[at]gmail[dot]com>
*@copyright2005MichalMigurski
*@versionCVS:$Id:JSON.php,v1.312006/06/2805:54:17migurskiExp$
*@licensehttp://www.opensource.org/licenses/bsd-license.php
*@linkhttp://pear.php.net/pepr/pepr-proposal-show.php?id=198
*/
/**
*MarkerconstantforServices_JSON::decode(),usedtoflagstackstate
*/
define('SERVICES_JSON_SLICE',1);
/**
*MarkerconstantforServices_JSON::decode(),usedtoflagstackstate
*/
define('SERVICES_JSON_IN_STR',2);
/**
*MarkerconstantforServices_JSON::decode(),usedtoflagstackstate
*/
define('SERVICES_JSON_IN_ARR',3);
/**
*MarkerconstantforServices_JSON::decode(),usedtoflagstackstate
*/
define('SERVICES_JSON_IN_OBJ',4);
/**
*MarkerconstantforServices_JSON::decode(),usedtoflagstackstate
*/
define('SERVICES_JSON_IN_CMT',5);
/**
*BehaviorswitchforServices_JSON::decode()
*/
define('SERVICES_JSON_LOOSE_TYPE',16);
/**
*BehaviorswitchforServices_JSON::decode()
*/
define('SERVICES_JSON_SUPPRESS_ERRORS',32);
/**
*ConvertstoandfromJSONformat.
*
*Briefexampleofuse:
*
*<code>
*//createanewinstanceofServices_JSON
*$json=newServices_JSON();
*
*//convertacomplexevaluetoJSONnotation,andsendittothebrowser
*$value=array('foo','bar',array(1,2,'baz'),array(3,array(4)));
*$output=$json->encode($value);
*
*print($output);
*//prints:["foo","bar",[1,2,"baz"],[3,[4]]]
*
*//acceptincomingPOSTdata,assumedtobeinJSONnotation
*$input=file_get_contents('php://input',1000000);
*$value=$json->decode($input);
*</code>
*/
classServices_JSON
{
/**
*constructsanewJSONinstance
*
*@paramint$useobjectbehaviorflags;combinewithboolean-OR
*
*possiblevalues:
*-SERVICES_JSON_LOOSE_TYPE:loosetyping.
*"{...}"syntaxcreatesassociativearrays
*insteadofobjectsindecode().
*-SERVICES_JSON_SUPPRESS_ERRORS:errorsuppression.
*Valueswhichcan'tbeencoded(e.g.resources)
*appearasNULLinsteadofthrowingerrors.
*Bydefault,adeeply-nestedresourcewill
*bubbleupwithanerror,soallreturnvalues
*fromencode()shouldbecheckedwithisError()
*/
functionServices_JSON($use=0)
{
$this->use=$use;
}
/**
*convertastringfromoneUTF-16chartooneUTF-8char
*
*Normallyshouldbehandledbymb_convert_encoding,but
*providesaslowerPHP-onlymethodforinstallations
*thatlackthemultibyestringextension.
*
*@paramstring$utf16UTF-16character
*@returnstringUTF-8character
*@accessprivate
*/
functionutf162utf8($utf16)
{
//ohpleaseohpleaseohpleaseohpleaseohplease
if(function_exists('mb_convert_encoding')){
returnmb_convert_encoding($utf16,'UTF-8','UTF-16');
}
$bytes=(ord($utf16{0})<<8)|ord($utf16{1});
switch(true){
case((0x7F&$bytes)==$bytes):
//thiscaseshouldneverbereached,becauseweareinASCIIrange
//see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
returnchr(0x7F&$bytes);
case(0x07FF&$bytes)==$bytes:
//returna2-byteUTF-8character
//see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
returnchr(0xC0|(($bytes>>6)&0x1F))
.chr(0x80|($bytes&0x3F));
case(0xFFFF&$bytes)==$bytes:
//returna3-byteUTF-8character
//see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
returnchr(0xE0|(($bytes>>12)&0x0F))
.chr(0x80|(($bytes>>6)&0x3F))
.chr(0x80|($bytes&0x3F));
}
//ignoringUTF-32fornow,sorry
return'';
}
/**
*convertastringfromoneUTF-8chartooneUTF-16char
*
*Normallyshouldbehandledbymb_convert_encoding,but
*providesaslowerPHP-onlymethodforinstallations
*thatlackthemultibyestringextension.
*
*@paramstring$utf8UTF-8character
*@returnstringUTF-16character
*@accessprivate
*/
functionutf82utf16($utf8)
{
//ohpleaseohpleaseohpleaseohpleaseohplease
if(function_exists('mb_convert_encoding')){
returnmb_convert_encoding($utf8,'UTF-16','UTF-8');
}
switch(strlen($utf8)){
case1:
//thiscaseshouldneverbereached,becauseweareinASCIIrange
//see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
return$utf8;
case2:
//returnaUTF-16characterfroma2-byteUTF-8char
//see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
returnchr(0x07&(ord($utf8{0})>>2))
.chr((0xC0&(ord($utf8{0})<<6))
|(0x3F&ord($utf8{1})));
case3:
//returnaUTF-16characterfroma3-byteUTF-8char
//see:http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
returnchr((0xF0&(ord($utf8{0})<<4))
|(0x0F&(ord($utf8{1})>>2)))
.chr((0xC0&(ord($utf8{1})<<6))
|(0x7F&ord($utf8{2})));
}
//ignoringUTF-32fornow,sorry
return'';
}
/**
*encodesanarbitraryvariableintoJSONformat
*
*@parammixed$varanynumber,boolean,string,array,orobjecttobeencoded.
*seeargument1toServices_JSON()aboveforarray-parsingbehavior.
*ifvarisastrng,notethatencode()alwaysexpectsit
*tobeinASCIIorUTF-8format!
*
*@returnmixedJSONstringrepresentationofinputvaroranerrorifaproblemoccurs
*@accesspublic
*/
functionencode($var)
{
switch(gettype($var)){
case'boolean':
return$var?'true':'false';
case'NULL':
return'null';
case'integer':
return(int)$var;
case'double':
case'float':
return(float)$var;
case'string':
//STRINGSAREEXPECTEDTOBEINASCIIORUTF-8FORMAT
$ascii='';
$strlen_var=strlen($var);
/*
*Iterateovereverycharacterinthestring,
*escapingwithaslashorencodingtoUTF-8wherenecessary
*/
for($c=0;$c<$strlen_var;++$c){
$ord_var_c=ord($var{$c});
switch(true){
case$ord_var_c==0x08:
$ascii.='\b';
break;
case$ord_var_c==0x09:
$ascii.='\t';
break;
case$ord_var_c==0x0A:
$ascii.='\n';
break;
case$ord_var_c==0x0C:
$ascii.='\f';
break;
case$ord_var_c==0x0D:
$ascii.='\r';
break;
case$ord_var_c==0x22:
case$ord_var_c==0x2F:
case$ord_var_c==0x5C:
//doublequote,slash,slosh
$ascii.='\\'.$var{$c};
break;
case(($ord_var_c>=0x20)&&($ord_var_c<=0x7F)):
//charactersU-00000000-U-0000007F(sameasASCII)
$ascii.=$var{$c};
break;
case(($ord_var_c&0xE0)==0xC0):
//charactersU-00000080-U-000007FF,mask110XXXXX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char=pack('C*',$ord_var_c,ord($var{$c+1}));
$c+=1;
$utf16=$this->utf82utf16($char);
$ascii.=sprintf('\u%04s',bin2hex($utf16));
break;
case(($ord_var_c&0xF0)==0xE0):
//charactersU-00000800-U-0000FFFF,mask1110XXXX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char=pack('C*',$ord_var_c,
ord($var{$c+1}),
ord($var{$c+2}));
$c+=2;
$utf16=$this->utf82utf16($char);
$ascii.=sprintf('\u%04s',bin2hex($utf16));
break;
case(($ord_var_c&0xF8)==0xF0):
//charactersU-00010000-U-001FFFFF,mask11110XXX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char=pack('C*',$ord_var_c,
ord($var{$c+1}),
ord($var{$c+2}),
ord($var{$c+3}));
$c+=3;
$utf16=$this->utf82utf16($char);
$ascii.=sprintf('\u%04s',bin2hex($utf16));
break;
case(($ord_var_c&0xFC)==0xF8):
//charactersU-00200000-U-03FFFFFF,mask111110XX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char=pack('C*',$ord_var_c,
ord($var{$c+1}),
ord($var{$c+2}),
ord($var{$c+3}),
ord($var{$c+4}));
$c+=4;
$utf16=$this->utf82utf16($char);
$ascii.=sprintf('\u%04s',bin2hex($utf16));
break;
case(($ord_var_c&0xFE)==0xFC):
//charactersU-04000000-U-7FFFFFFF,mask1111110X
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char=pack('C*',$ord_var_c,
ord($var{$c+1}),
ord($var{$c+2}),
ord($var{$c+3}),
ord($var{$c+4}),
ord($var{$c+5}));
$c+=5;
$utf16=$this->utf82utf16($char);
$ascii.=sprintf('\u%04s',bin2hex($utf16));
break;
}
}
return'"'.$ascii.'"';
case'array':
/*
*AsperJSONspecifanyarraykeyisnotaninteger
*wemusttreatthethewholearrayasanobject.We
*alsotrytocatchasparselypopulatedassociative
*arraywithnumerickeysherebecausesomeJSengines
*willcreateanarraywithemptyindexesupto
*max_indexwhichcancausememoryissuesandbecause
*thekeys,whichmayberelevant,willberemapped
*otherwise.
*
*AspertheECMAandJSONspecificationanobjectmay
*haveanystringasaproperty.Unfortunatelydueto
*aholeintheECMAspecificationifthekeyisa
*ECMAreservedwordorstartswithadigitthe
*parameterisonlyaccessibleusingECMAScript's
*bracketnotation.
*/
//treatasaJSONobject
if(is_array($var)&&count($var)&&(array_keys($var)!==range(0,sizeof($var)-1))){
$properties=array_map(array($this,'name_value'),
array_keys($var),
array_values($var));
foreach($propertiesas$property){
if(Services_JSON::isError($property)){
return$property;
}
}
return'{'.join(',',$properties).'}';
}
//treatitlikearegulararray
$elements=array_map(array($this,'encode'),$var);
foreach($elementsas$element){
if(Services_JSON::isError($element)){
return$element;
}
}
return'['.join(',',$elements).']';
case'object':
$vars=get_object_vars($var);
$properties=array_map(array($this,'name_value'),
array_keys($vars),
array_values($vars));
foreach($propertiesas$property){
if(Services_JSON::isError($property)){
return$property;
}
}
return'{'.join(',',$properties).'}';
default:
return($this->use&SERVICES_JSON_SUPPRESS_ERRORS)
?'null'
:newServices_JSON_Error(gettype($var)."cannotbeencodedasJSONstring");
}
}
/**
*array-walkingfunctionforuseingeneratingJSON-formattedname-valuepairs
*
*@paramstring$namenameofkeytouse
*@parammixed$valuereferencetoanarrayelementtobeencoded
*
*@returnstringJSON-formattedname-valuepair,like'"name":value'
*@accessprivate
*/
functionname_value($name,$value)
{
$encoded_value=$this->encode($value);
if(Services_JSON::isError($encoded_value)){
return$encoded_value;
}
return$this->encode(strval($name)).':'.$encoded_value;
}
/**
*reduceastringbyremovingleadingandtrailingcommentsandwhitespace
*
*@param$strstringstringvaluetostripofcommentsandwhitespace
*
*@returnstringstringvaluestrippedofcommentsandwhitespace
*@accessprivate
*/
functionreduce_string($str)
{
$str=preg_replace(array(
//eliminatesinglelinecommentsin'//...'form
'#^\s*//(.+)$#m',
//eliminatemulti-linecommentsin'/*...*/'form,atstartofstring
'#^\s*/\*(.+)\*/#Us',
//eliminatemulti-linecommentsin'/*...*/'form,atendofstring
'#/\*(.+)\*/\s*$#Us'
),'',$str);
//eliminateextraneousspace
returntrim($str);
}
/**
*decodesaJSONstringintoappropriatevariable
*
*@paramstring$strJSON-formattedstring
*
*@returnmixednumber,boolean,string,array,orobject
*correspondingtogivenJSONinputstring.
*Seeargument1toServices_JSON()aboveforobject-outputbehavior.
*Notethatdecode()alwaysreturnsstrings
*inASCIIorUTF-8format!
*@accesspublic
*/
functiondecode($str)
{
$str=$this->reduce_string($str);
switch(strtolower($str)){
case'true':
returntrue;
case'false':
returnfalse;
case'null':
returnnull;
default:
$m=array();
if(is_numeric($str)){
//Lookie-loo,it'sanumber
//Thiswouldworkonitsown,butI'mtryingtobe
//goodaboutreturningintegerswhereappropriate:
//return(float)$str;
//Returnfloatorint,asappropriate
return((float)$str==(integer)$str)
?(integer)$str
:(float)$str;
}elseif(preg_match('/^("|\').*(\1)$/s',$str,$m)&&$m[1]==$m[2]){
//STRINGSRETURNEDINUTF-8FORMAT
$delim=substr($str,0,1);
$chrs=substr($str,1,-1);
$utf8='';
$strlen_chrs=strlen($chrs);
for($c=0;$c<$strlen_chrs;++$c){
$substr_chrs_c_2=substr($chrs,$c,2);
$ord_chrs_c=ord($chrs{$c});
switch(true){
case$substr_chrs_c_2=='\b':
$utf8.=chr(0x08);
++$c;
break;
case$substr_chrs_c_2=='\t':
$utf8.=chr(0x09);
++$c;
break;
case$substr_chrs_c_2=='\n':
$utf8.=chr(0x0A);
++$c;
break;
case$substr_chrs_c_2=='\f':
$utf8.=chr(0x0C);
++$c;
break;
case$substr_chrs_c_2=='\r':
$utf8.=chr(0x0D);
++$c;
break;
case$substr_chrs_c_2=='\\"':
case$substr_chrs_c_2=='\\\'':
case$substr_chrs_c_2=='\\\\':
case$substr_chrs_c_2=='\\/':
if(($delim=='"'&&$substr_chrs_c_2!='\\\'')||
($delim=="'"&&$substr_chrs_c_2!='\\"')){
$utf8.=$chrs{++$c};
}
break;
casepreg_match('/\\\u[0-9A-F]{4}/i',substr($chrs,$c,6)):
//single,escapedunicodecharacter
$utf16=chr(hexdec(substr($chrs,($c+2),2)))
.chr(hexdec(substr($chrs,($c+4),2)));
$utf8.=$this->utf162utf8($utf16);
$c+=5;
break;
case($ord_chrs_c>=0x20)&&($ord_chrs_c<=0x7F):
$utf8.=$chrs{$c};
break;
case($ord_chrs_c&0xE0)==0xC0:
//charactersU-00000080-U-000007FF,mask110XXXXX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8.=substr($chrs,$c,2);
++$c;
break;
case($ord_chrs_c&0xF0)==0xE0:
//charactersU-00000800-U-0000FFFF,mask1110XXXX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8.=substr($chrs,$c,3);
$c+=2;
break;
case($ord_chrs_c&0xF8)==0xF0:
//charactersU-00010000-U-001FFFFF,mask11110XXX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8.=substr($chrs,$c,4);
$c+=3;
break;
case($ord_chrs_c&0xFC)==0xF8:
//charactersU-00200000-U-03FFFFFF,mask111110XX
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8.=substr($chrs,$c,5);
$c+=4;
break;
case($ord_chrs_c&0xFE)==0xFC:
//charactersU-04000000-U-7FFFFFFF,mask1111110X
//seehttp://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$utf8.=substr($chrs,$c,6);
$c+=5;
break;
}
}
return$utf8;
}elseif(preg_match('/^\[.*\]$/s',$str)||preg_match('/^\{.*\}$/s',$str)){
//array,orobjectnotation
if($str{0}=='['){
$stk=array(SERVICES_JSON_IN_ARR);
$arr=array();
}else{
if($this->use&SERVICES_JSON_LOOSE_TYPE){
$stk=array(SERVICES_JSON_IN_OBJ);
$obj=array();
}else{
$stk=array(SERVICES_JSON_IN_OBJ);
$obj=newstdClass();
}
}
array_push($stk,array('what'=>SERVICES_JSON_SLICE,
'where'=>0,
'delim'=>false));
$chrs=substr($str,1,-1);
$chrs=$this->reduce_string($chrs);
if($chrs==''){
if(reset($stk)==SERVICES_JSON_IN_ARR){
return$arr;
}else{
return$obj;
}
}
//print("\nparsing{$chrs}\n");
$strlen_chrs=strlen($chrs);
for($c=0;$c<=$strlen_chrs;++$c){
$top=end($stk);
$substr_chrs_c_2=substr($chrs,$c,2);
if(($c==$strlen_chrs)||(($chrs{$c}==',')&&($top['what']==SERVICES_JSON_SLICE))){
//foundacommathatisnotinsideastring,array,etc.,
//ORwe'vereachedtheendofthecharacterlist
$slice=substr($chrs,$top['where'],($c-$top['where']));
array_push($stk,array('what'=>SERVICES_JSON_SLICE,'where'=>($c+1),'delim'=>false));
//print("Foundsplitat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n");
if(reset($stk)==SERVICES_JSON_IN_ARR){
//weareinanarray,sojustpushanelementontothestack
array_push($arr,$this->decode($slice));
}elseif(reset($stk)==SERVICES_JSON_IN_OBJ){
//weareinanobject,sofigure
//outthepropertynameandsetan
//elementinanassociativearray,
//fornow
$parts=array();
if(preg_match('/^\s*(["\'].*[^\\\]["\'])\s*:\s*(\S.*),?$/Uis',$slice,$parts)){
//"name":valuepair
$key=$this->decode($parts[1]);
$val=$this->decode($parts[2]);
if($this->use&SERVICES_JSON_LOOSE_TYPE){
$obj[$key]=$val;
}else{
$obj->$key=$val;
}
}elseif(preg_match('/^\s*(\w+)\s*:\s*(\S.*),?$/Uis',$slice,$parts)){
//name:valuepair,wherenameisunquoted
$key=$parts[1];
$val=$this->decode($parts[2]);
if($this->use&SERVICES_JSON_LOOSE_TYPE){
$obj[$key]=$val;
}else{
$obj->$key=$val;
}
}
}
}elseif((($chrs{$c}=='"')||($chrs{$c}=="'"))&&($top['what']!=SERVICES_JSON_IN_STR)){
//foundaquote,andwearenotinsideastring
array_push($stk,array('what'=>SERVICES_JSON_IN_STR,'where'=>$c,'delim'=>$chrs{$c}));
//print("Foundstartofstringat{$c}\n");
}elseif(($chrs{$c}==$top['delim'])&&
($top['what']==SERVICES_JSON_IN_STR)&&
((strlen(substr($chrs,0,$c))-strlen(rtrim(substr($chrs,0,$c),'\\')))%2!=1)){
//foundaquote,we'reinastring,andit'snotescaped
//weknowthatit'snotescapedbecasethereis_not_an
//oddnumberofbackslashesattheendofthestringsofar
array_pop($stk);
//print("Foundendofstringat{$c}:".substr($chrs,$top['where'],(1+1+$c-$top['where']))."\n");
}elseif(($chrs{$c}=='[')&&
in_array($top['what'],array(SERVICES_JSON_SLICE,SERVICES_JSON_IN_ARR,SERVICES_JSON_IN_OBJ))){
//foundaleft-bracket,andweareinanarray,object,orslice
array_push($stk,array('what'=>SERVICES_JSON_IN_ARR,'where'=>$c,'delim'=>false));
//print("Foundstartofarrayat{$c}\n");
}elseif(($chrs{$c}==']')&&($top['what']==SERVICES_JSON_IN_ARR)){
//foundaright-bracket,andwe'reinanarray
array_pop($stk);
//print("Foundendofarrayat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n");
}elseif(($chrs{$c}=='{')&&
in_array($top['what'],array(SERVICES_JSON_SLICE,SERVICES_JSON_IN_ARR,SERVICES_JSON_IN_OBJ))){
//foundaleft-brace,andweareinanarray,object,orslice
array_push($stk,array('what'=>SERVICES_JSON_IN_OBJ,'where'=>$c,'delim'=>false));
//print("Foundstartofobjectat{$c}\n");
}elseif(($chrs{$c}=='}')&&($top['what']==SERVICES_JSON_IN_OBJ)){
//foundaright-brace,andwe'reinanobject
array_pop($stk);
//print("Foundendofobjectat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n");
}elseif(($substr_chrs_c_2=='/*')&&
in_array($top['what'],array(SERVICES_JSON_SLICE,SERVICES_JSON_IN_ARR,SERVICES_JSON_IN_OBJ))){
//foundacommentstart,andweareinanarray,object,orslice
array_push($stk,array('what'=>SERVICES_JSON_IN_CMT,'where'=>$c,'delim'=>false));
$c++;
//print("Foundstartofcommentat{$c}\n");
}elseif(($substr_chrs_c_2=='*/')&&($top['what']==SERVICES_JSON_IN_CMT)){
//foundacommentend,andwe'reinonenow
array_pop($stk);
$c++;
for($i=$top['where'];$i<=$c;++$i)
$chrs=substr_replace($chrs,'',$i,1);
//print("Foundendofcommentat{$c}:".substr($chrs,$top['where'],(1+$c-$top['where']))."\n");
}
}
if(reset($stk)==SERVICES_JSON_IN_ARR){
return$arr;
}elseif(reset($stk)==SERVICES_JSON_IN_OBJ){
return$obj;
}
}
}
}
/**
*@todoUltimately,thisshouldjustcallPEAR::isError()
*/
functionisError($data,$code=null)
{
if(class_exists('pear')){
returnPEAR::isError($data,$code);
}elseif(is_object($data)&&(get_class($data)=='services_json_error'||is_subclass_of($data,'services_json_error'))){
returntrue;
}
returnfalse;
}
}
if(class_exists('PEAR_Error')){
classServices_JSON_ErrorextendsPEAR_Error
{
functionServices_JSON_Error($message='unknownerror',$code=null,$mode=null,$options=null,$userinfo=null)
{
parent::PEAR_Error($message,$code,$mode,$options,$userinfo);
}
}
}else{
/**
*@todoUltimately,thisclassshallbedescendedfromPEAR_Error
*/
classServices_JSON_Error
{
functionServices_JSON_Error($message='unknownerror',$code=null,$mode=null,$options=null,$userinfo=null)
{
}
}
}
?>
希望本文所述对大家的php程序设计有所帮助。