Jsoncpp遍历

本文介绍了如何使用Jsoncpp库遍历和解析Json数据。通过提供的D:codejsoncpp-src-0.6.0-rc2srcjsontestrunnermain.cpp测试代码,展示了如何将Json数据递归输出为字符串。Json::Value是Json数据的基本单元,而Json::Value::Member类似vector<string>,用于存储成员名称。此外,还提供了一个简单的批处理脚本来编译main.cpp,并通过命令行参数解析.json文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用Jsoncpp代码比较简单,各个类都容易理解,这里说一下遍历这个Json数据的方式。源码中直接提供了测试代码,D:\code\jsoncpp-src-0.6.0-rc2\src\jsontestrunner\main.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=null\n", path.c_str() );
      break;
   case Json::intValue:
      fprintf( fout, "%s=%s\n", path.c_str(), Json::valueToString( value.asLargestInt() ).c_str() );
      break; 
   case Json::uintValue:
      fprintf( fout, "%s=%s\n", path.c_str(), Json::valueToString( value.asLargestUInt() ).c_str() );
      break;
   case Json::realValue:
      fprintf( fout, "%s=%.16g\n", path.c_str(), value.asDouble() );
      break;
   case Json::stringValue:
      fprintf( fout, "%s=\"%s\"\n", path.c_str(), value.asString().c_str() );
      break;
   case Json::booleanValue:
      fprintf( fout, "%s=%s\n", path.c_str(), 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 .\src\jsontestrunner\main.cpp .\src\lib_json\*.cpp /I .\include\json\ /I .\include 
echo delete *.obj files... 
del.\*.obj
pause
echo on

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值