加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Jsoncpp遍历

发布时间:2020-12-16 19:29:14 所属栏目:百科 来源:网络整理
导读:使用Jsoncpp代码比较简单,各个类都容易理解,这里说一下遍历这个Json数据的方式。源码中直接提供了测试代码,D:codejsoncpp-src-0.6.0-rc2srcjsontestrunnermain.cpp,里面printValueTree就是遍历函数,下面贴代码 fout:输出设备,可以是控制台或文件

使用Jsoncpp代码比较简单,各个类都容易理解,这里说一下遍历这个Json数据的方式。源码中直接提供了测试代码,D:codejsoncpp-src-0.6.0-rc2srcjsontestrunnermain.cpp,里面printValueTree就是遍历函数,下面贴代码

fout:输出设备,可以是控制台或文件

Value:这个是Json数据解码后的基本单元,或者节点

path: 各层节点的分级字符串

代码很简单,递归输出成字符串,只有一个地方解释一下,Json::Value::Member 就是 vector<string> ,可以从value类中看到typedef std::vector<std::string>Json::Value::Members

static void
printValueTree( FILE *fout,Json::Value &value,const std::string &path = "." )
{
   switch ( value.type() )
   {
   case Json::nullValue:
      fprintf( fout,"%s=nulln",path.c_str() );
      break;
   case Json::intValue:
      fprintf( fout,"%s=%sn",path.c_str(),Json::valueToString( value.asLargestInt() ).c_str() );
      break; 
   case Json::uintValue:
      fprintf( fout,Json::valueToString( value.asLargestUInt() ).c_str() );
      break;
   case Json::realValue:
      fprintf( fout,"%s=%.16gn",value.asDouble() );
      break;
   case Json::stringValue:
      fprintf( fout,"%s="%s"n",value.asString().c_str() );
      break;
   case Json::booleanValue:
      fprintf( fout,value.asBool() ? "true" : "false" );
      break;
   case Json::arrayValue:
      {
         fprintf( fout,"%s=[]n",path.c_str() );
         int size = value.size();
         for ( int index =0; index < size; ++index )
         {
            static char buffer[16];
            sprintf( buffer,"[%d]",index );
            printValueTree( fout,value[index],path + buffer );
         }
      }
      break;
   case Json::objectValue:
      {
         fprintf( fout,"%s={}n",path.c_str() );
         Json::Value::Members members( value.getMemberNames() );
         std::sort( members.begin(),members.end() );
         std::string suffix = *(path.end()-1) == '.' ? "" : ".";
         for ( Json::Value::Members::iterator it = members.begin(); 
               it != members.end(); 
               ++it )
         {
            const std::string &name = *it;
            printValueTree( fout,value[name],path + suffix + name );
         }
      }
      break;
   default:
      break;
   }
}

如果你对该目录下的main.cpp文件感兴趣,不妨把它编译成exe,这里直接通一个在控制台使用cl编译的简单批处理脚本,直接在jsoncpp-src-0.6.0-rc2目录下执行:

jsoncpp-src-0.6.0-rc2

echo off
echo start comparing and linking...
echo ..............................
cl .srcjsontestrunnermain.cpp .srclib_json*.cpp /I .includejson /I .include
echo delete *.obj files...
del.*.obj
pause
echo on

使用时的命令行参数为后缀名 为.json的json格式文件,解析后会在同级目录下生成3个解析文件

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读