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

188 lines
2.9 KiB
C++

/**
@file JCJson.h
@brief
@author James
@version 1.0
@date 2014_6_17
*/
#ifndef __JCJson_H__
#define __JCJson_H__
#include <stdio.h>
#include <vector>
#include <string.h>
#pragma warning (disable: 4996)
namespace laya
{
enum PASER_JSON_STATE
{
PJ_STATE_INIT = 0, //初始状态
PJ_STATE_MATCHING_KEY, //匹配key的状态
PJ_STATE_MATCHING_VALUE, //匹配value状态
PJ_STATE_MATCHING_OBJECT, //匹配Object
PJ_STATE_MATCHING_ARRAY, //匹配Array
};
class JsonNode
{
public:
char* m_sKey;
int m_nKey;
unsigned char m_nType;
JsonNode()
{
m_sKey = NULL;
m_nKey = 0;
m_nType = -1;
}
virtual ~JsonNode()
{
m_sKey = NULL;
m_nKey = 0;
m_nType = -1;
}
void setKey( char* p_sKey)
{
m_sKey = p_sKey;
}
virtual bool addChild( JsonNode* p_pChild )
{
return false;
}
virtual bool clearChild()
{
return false;
}
};
struct JsonValue : JsonNode
{
JsonValue()
{
m_sKey = NULL;
m_nKey = 0;
m_nType = 0;
m_sValue = NULL;
}
~JsonValue()
{
}
void setKeyAndValue( char* p_sKey,char* p_sValue )
{
m_sKey = p_sKey;
m_sValue = p_sValue;
}
bool addChild( JsonNode* p_pChild )
{
return false;
}
char* m_sValue;
};
struct JsonObject : JsonNode
{
JsonObject()
{
m_sKey = NULL;
m_nKey = 0;
m_nType = 1;
}
~JsonObject()
{
}
bool addChild( JsonNode* p_pChild )
{
m_vVector.push_back( p_pChild );
return true;
}
bool clearChild()
{
for( int i = 0,nSize = (int)(m_vVector.size()); i < nSize; i++ )
{
if( m_vVector[i] != NULL )
{
m_vVector[i]->clearChild();
delete m_vVector[i];
m_vVector[i] = NULL;
}
}
m_vVector.clear();
return true;
}
JsonNode* getNode(const char* p_pszName) {
for (int i = 0, sz = (int)m_vVector.size(); i < sz; i++) {
JsonNode* pN = m_vVector[i];
if (strcmp(pN->m_sKey, p_pszName) == 0) {
return pN;
}
}
return NULL;
}
std::vector<JsonNode*> m_vVector;
};
struct JsonArray : JsonNode
{
JsonArray()
{
m_sKey = NULL;
m_nKey = 0;
m_nType = 2;
}
~JsonArray()
{
}
bool addChild( JsonNode* p_pChild )
{
m_vVector.push_back( p_pChild );
return true;
}
bool clearChild()
{
for( int i = 0,nSize = (int)(m_vVector.size()); i < nSize; i++ )
{
if( m_vVector[i] != NULL )
{
m_vVector[i]->clearChild();
delete m_vVector[i];
m_vVector[i] = NULL;
}
}
m_vVector.clear();
return true;
}
std::vector<JsonNode*> m_vVector;
};
class JCJson
{
public:
JCJson();
~JCJson();
bool cleanUp();
//注意啦,为了效率,这个buffer没有自己拷贝,外部也先不要删除
bool paserJson( char* p_sBuffer );
bool paserJson( char* p_sBuffer, int len);
JsonNode* getRoot();
private:
int paserJson( char* p_sBuffer,int p_nBufferSize,int p_nOffset,JsonNode* p_pNode );
private:
JsonNode* m_pRoot;
};
}
#endif //__JCJson_H__
//-----------------------------END FILE--------------------------------