c++编写json解析类(四)

2014-11-24 09:52:14 · 作者: · 浏览: 3
* m_str;
NODE *m_root;
string m_strOutput;

};
typedef CJson::NODE JsonNode;

json.cpp

[cpp]
#include "json.h"
CJson::CJson()
{
m_str=0;
m_root=0;
}
CJson::~CJson()
{
Release(m_root);
if(m_str)
{
delete[] m_str;
m_str=0;
}
}
void CJson::Release(NODE* node)
{
if(node)
{
Release(node->m_child);
Release(node->m_next);
delete node;
}

}
JsonNode* CJson::GetRoot()
{
return m_root;
}
bool CJson::Load(char* str)
{
NODE* CurNode;
#define CHECKBLANK(ch) (ch==' ' || ch=='\t' || ch=='\r' || ch=='\n')
if(str==0 || *str==0)
{
return false;
}
m_str=new char[strlen(str)+1];
strcpy(m_str,str);
int i=0;
while(m_str[i]!='{')
{
i++;
}
i++;
NODE *m_par=0,*m_cur=0;
bool bInKey=true;
while(m_str[i])
{
if(!CHECKBLANK(m_str[i]))
{
if(m_str[i]==',')
{
bInKey=true;
}
else if(m_str[i]==':')
{
bInKey=false;
}
else if(m_str[i]=='[')
{
if(!bInKey)
{

m_cur->type=ARRAY;
m_par=m_cur;
bInKey=true;

}
else
{
NODE *node=new NODE;
memset(node,0,sizeof(NODE));
node->type=ARRAYA;
node->m_parent=m_par;
m_cur=node;
if(m_par->m_child==0)
{
m_par->m_child=node;
}
else
{
NODE *n=m_par->m_child;
while(n->m_next)
{
n=n->m_next;
}
n->m_next=node;
}
m_par=node;
}

}
else if(m_str[i]==']')
{
if(m_par)
{
m_par=m_par->m_parent;
}
bInKey=true;
}
else if(m_str[i]=='{')
{
if(!bInKey)
{

m_cur->type=OBJECT;
m_par=m_cur;
bInKey=true;

}
else
{
NODE *node=new NODE;
memset(node,0,sizeof(NODE));
node->type=OBJECTA;
node->m_parent=m_par;
m_cur=node;
if(m_par->m_child==0)
{
m_par->m_child=node;
}
else
{
NODE *n=m_par->m_child;
while(n->m_next)
{
n=n->m_next;
}
n->m_next=node;
}
m_par=node;