Files
LayaNative2.0/Conch/source/common/util/JCJson.cpp
T
2020-11-11 16:17:13 +08:00

249 lines
5.8 KiB
C++

/**
@file JCJson.cpp
@brief
@author wyw
@version 1.0
@date 2014_6_17
*/
#include "JCJson.h"
#include <ctype.h>
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--------------------------------