【原创】TinyJSON使用,并进一步封装

引用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++水平太差 以致于得到的值只能全部转换为字符型,废话不说了 上代码

ContractedBlock.gif ExpandedBlockStart.gif Code
//这里用于得到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;
}

         

 

使用示例 :

ContractedBlock.gif ExpandedBlockStart.gif Code
    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)
ExpandedBlockStart.gifContractedBlock.gif    
{
        str 
= "";                
        
for (int i=0;i<5;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            
//读取list里面的子列表
            if (GetValue(GetArray(*it,i))=="<ARRAY>")
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                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)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    
for (int j=0;j<5;j++)                    
                        str.Append(
"\t" + GetValue(GetArray(*it2,j))+"\r\n");
                    str.Append(
"\t-----\r\n");
                }

            }

            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                str.Append(GetValue(GetArray(
*it,i))+"\r\n");
            }

        }

        AfxMessageBox(str);        

相对来说 省了一些代码量,却增加了类型转换,始终还是自已功力太浅啊。

 

转载于:https://www.cnblogs.com/winlmh/archive/2009/08/18/1549289.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值