/** @file JCJson.cpp @brief @author wyw @version 1.0 @date 2014_6_17 */ #include "JCJson.h" #include namespace laya { //------------------------------------------------------------------------------ JCJson::JCJson() { m_pRoot = NULL; } //------------------------------------------------------------------------------ JCJson::~JCJson() { cleanUp(); } //------------------------------------------------------------------------------ bool JCJson::cleanUp() { if( m_pRoot != NULL ) { m_pRoot->clearChild(); delete m_pRoot; m_pRoot = NULL; } return true; } //------------------------------------------------------------------------------ JsonNode* JCJson::getRoot() { return m_pRoot; } //------------------------------------------------------------------------------ bool JCJson::paserJson( char* p_sBuffer ) { return paserJson(p_sBuffer, strlen(p_sBuffer)); } //------------------------------------------------------------------------------ bool JCJson::paserJson( char* p_sBuffer, int len ) { if( p_sBuffer == NULL )return false; if( m_pRoot == NULL ) { m_pRoot = new JsonObject(); } int nBufferSize = len; //找到第一个 “{” 这样做是为了避免 文件开头有其他文字 int i = 0; while( i < nBufferSize ) { if( p_sBuffer[i] != '{' ) { i++; } else { break; } } int nOffset = i + 1; paserJson( p_sBuffer,nBufferSize,nOffset,m_pRoot ); return true; } //------------------------------------------------------------------------------ int JCJson::paserJson( char* p_sBuffer,int p_nBufferSize,int p_nOffset,JsonNode* p_pNode ) { if( p_nOffset >= p_nBufferSize ) return p_nOffset; int i = p_nOffset; bool bValueString = false; char* sKey = NULL; char* sValue = NULL; PASER_JSON_STATE nState = PJ_STATE_INIT; while( i < p_nBufferSize ) { //初始状态 if( nState == PJ_STATE_INIT ) { //如果找到的是 " 就开始进入匹配KEY的状态 if( p_sBuffer[i] == '"' ) { nState = PJ_STATE_MATCHING_KEY; sKey = (p_sBuffer + i + 1); } //如果是 { 证明又是一个对象,重新递归读取对象 else if( p_sBuffer[i] == '{' ) { JsonObject* pObject = new JsonObject(); p_pNode->addChild( pObject ); i = paserJson( p_sBuffer,p_nBufferSize,++i,pObject ); //数据恢复 { nState = PJ_STATE_INIT; sKey = NULL; sValue = NULL; } } else if( p_sBuffer[i] == '}' ) { return i; } else if( p_sBuffer[i] == ']' ) { return i; } //这个有点凑了,,因为在文件中会出现 "mat": [1.3,0,0,1.3,0.294,2.893] //这样的现象,所以要处理 else if( isgraph( p_sBuffer[i] ) && ( p_sBuffer[i] != ',' ) ) { sKey = (char*)""; sValue = p_sBuffer + i; nState = PJ_STATE_MATCHING_VALUE; } } //如果是匹配key,知道匹配上 " key的值就有了,并进入匹配value阶段 else if( nState == PJ_STATE_MATCHING_KEY ) { if( p_sBuffer[i] == '"' ) { p_sBuffer[i] = 0; } else if( p_sBuffer[i] == ':' ) { bValueString = false; sValue = p_sBuffer + i + 1; nState = PJ_STATE_MATCHING_VALUE; } // == ',' 和 下面的 } ] 这两个是为了,怕碰到这种情况 "config_file_path": ["daji0.plist","daji1.plist"] else if( p_sBuffer[i] == ',' ) { JsonValue* pJsonValue = new JsonValue(); p_sBuffer[i] = 0; pJsonValue->setKeyAndValue( (char*)"",sKey ); p_pNode->addChild( pJsonValue ); //数据恢复 { nState = PJ_STATE_INIT; sKey = NULL; sValue = NULL; } } else if( p_sBuffer[i] == '}' || p_sBuffer[i] == ']' ) { JsonValue* pJsonValue = new JsonValue(); p_sBuffer[i] = 0; pJsonValue->setKeyAndValue( (char*)"",sKey ); p_pNode->addChild( pJsonValue ); return i; } } //开始匹配value else if( nState == PJ_STATE_MATCHING_VALUE ) { if( bValueString == false ) { if( p_sBuffer[i] == '"') { sValue = p_sBuffer + i + 1; bValueString = true; } //如果是 [ 是数组,再次递归 else if( p_sBuffer[i] == '[' ) { nState = PJ_STATE_MATCHING_ARRAY; JsonArray* pArray = new JsonArray(); pArray->setKey( sKey ); p_pNode->addChild( pArray ); i = paserJson( p_sBuffer,p_nBufferSize,++i,pArray ); //数据恢复 { nState = PJ_STATE_INIT; sKey = NULL; sValue = NULL; } } //如果是 { 是object,再次递归 else if( p_sBuffer[i] == '{' ) { nState = PJ_STATE_MATCHING_OBJECT; JsonObject* pObject = new JsonObject(); pObject->setKey( sKey ); p_pNode->addChild( pObject ); i = paserJson( p_sBuffer,p_nBufferSize,++i,pObject ); //数据恢复 { nState = PJ_STATE_INIT; sKey = NULL; sValue = NULL; } } else if( p_sBuffer[i] == ',' ) { JsonValue* pJsonValue = new JsonValue(); p_sBuffer[i] = 0; pJsonValue->setKeyAndValue( sKey,sValue ); p_pNode->addChild( pJsonValue ); //数据恢复 { nState = PJ_STATE_INIT; sKey = NULL; sValue = NULL; } } else if( p_sBuffer[i] == '}' || p_sBuffer[i] == ']' ) { JsonValue* pJsonValue = new JsonValue(); p_sBuffer[i] = 0; pJsonValue->setKeyAndValue( sKey,sValue ); p_pNode->addChild( pJsonValue ); return i; } } else { if( p_sBuffer[i] == '"' ) { JsonValue* pJsonValue = new JsonValue(); p_sBuffer[i] = 0; pJsonValue->setKeyAndValue( sKey,sValue ); p_pNode->addChild( pJsonValue ); bValueString = false; //数据恢复 { nState = PJ_STATE_INIT; sKey = NULL; sValue = NULL; } } } } i++; } return i; } //------------------------------------------------------------------------------ } //------------------------------------------------------------------------------ //-----------------------------END FILE--------------------------------