使用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个解析文件