引用www.json.org上的对JSON这种数据格式的介绍:
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-2
62 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
简单地说,JSON就是一种基于Javascript的轻量级数据交换格式。它给我的感觉有点类似于xml,但写法更随意,并且用途不同。
这篇文章不会介绍JSON本身,因此,如果您首次接触JSON,请务必先到http://www.json.org/去看完introduction.(这里还有中文版:http://www.json.org/json-zh.html)。
简单的使用方法请见:http://www.cppblog.com/epubcn/archive/2009/08/05/92267.html
深蓝色系统 的介绍简单的JSON处理还好 如果稍复杂一点的,感觉代码量就太多了,我这里稍稍封装了一下,由于C++水平太差 以致于得到的值只能全部转换为字符型,废话不说了 上代码
//这里用于得到JSON的值
CString GetValue(const json::grammar<char>::variant &var)
{
CString re;
if(var->empty())
{
re = "";
}
else if(var->type() == typeid(bool))
{
bool bValue = boost::any_cast< bool >(*var);
re = bValue?"true":"false";
}
else if(var->type() == typeid(int))
{
int iValue = boost::any_cast< int >(*var);
re.Format("%d",iValue);
}
else if(var->type() == typeid(double))
{
double dValue = boost::any_cast< double >(*var);
re.Format("%.16g",dValue);
}
else if(var->type() == typeid(std::string))
{
std::string strValue = boost::any_cast< std::string >(*var);
re = strValue.c_str();
}
else if(var->type() == typeid(json::grammar<char>::array))
{
re = "<ARRAY>";
}
else if(var->type() == typeid(json::grammar<char>::object))
{
re = "<OBJECT>";
}
else
{
re = "Err";
}
return re;
}
//这里用于返回JSON的 {aa:"aa",bb:"bb"} 中的值
json::grammar<char>::variant CTstJsonDlg::GetObj(const json::grammar<char>::variant &var,const std::string &path /* = */)
{
json::grammar<char>::object const & o = boost::any_cast< json::grammar<char>::object >(*var);
for (json::grammar<char>::object::const_iterator it = o.begin();it!=o.end();++it)
{
std::string strName = (*it).first;
if (strName==path)
{
return (*it).second;
}
}
//否则返回空值
json::grammar<char>::variant v;
return v;
}
//返回JSON中的 [1,2,3,55,66] 值
json::grammar<char>::variant CTstJsonDlg::GetArray(const json::grammar<char>::variant &var,int num/* =0 */)
{
json::grammar<char>::array const & a = boost::any_cast<json::grammar<char>::array>(*var);
int i=0;
for (json::grammar<char>::array::const_iterator it = a.begin();it!=a.end();++it)
{
if (num==i)
{
return *it;
}
i++;
}
//否则返回空值
json::grammar<char>::variant v;
return v;
}
使用示例 :
m_str = "{\"ret\":\"0\",\"plus_finish\":585121,\"list\":[[68634,\"万蝠洞\",566786,3231856,[[1,3,30,1,338901],[2,3,29,1,184208],[3,3,29,1,201769]],[]]]}";
std::string s = m_str.GetBuffer();
json::grammar<char>::variant v;
v = json::parse(s.begin(),s.end());
//读取ret中的值
AfxMessageBox(GetValue(GetObj(v,"ret")));
json::grammar<char>::variant v1 = GetObj(v,"list");
CString str;
json::grammar<char>::array const & a = boost::any_cast<json::grammar<char>::array>(*v1);
//读取 list里面列表
for (json::grammar<char>::array::const_iterator it = a.begin();it!=a.end();++it)
{
str = "";
for (int i=0;i<5;i++)
{
//读取list里面的子列表
if (GetValue(GetArray(*it,i))=="<ARRAY>")
{
json::grammar<char>::array const & a2 = boost::any_cast<json::grammar<char>::array>(*GetArray(*it,i));
for (json::grammar<char>::array::const_iterator it2 = a2.begin();it2!=a2.end();++it2)
{
for (int j=0;j<5;j++)
str.Append("\t" + GetValue(GetArray(*it2,j))+"\r\n");
str.Append("\t-----\r\n");
}
}
else
{
str.Append(GetValue(GetArray(*it,i))+"\r\n");
}
}
AfxMessageBox(str);
相对来说 省了一些代码量,却增加了类型转换,始终还是自已功力太浅啊。