Jsoncpp库使用说明
Jsoncpp是一个使用C++语言实现的面向对象的json库
Jsoncpp提供的接口中有3个核心类:Reader、Writer、Value。
Reader类负责从字符串或者输入流中加载JSON文档,并进行解析,生成代表JSON文档的Value对象。
Writer类负责将内存中的Value对象转换成JSON文档,输出到文件或者是字符串中。
Value类的对象代表一个JSON值,既可以代表一个文档,也可以代表文档中一个值。如同JSON中定义的“值”一样,Value是递归的。
解析JSON文档
解析一个JSON文档的大致过程如下:
//生命顶级Value对象
Json::Value root;
//读取文档:
Std::string strdoc = readFromFile(…);
//声明Reader对象
Json::Reader _reader;
//解析json文档
_reader.paser(strdoc, root);
Json::ValueType有8种,以下是定义。
enum Json::ValueType |
Type of the value held by a Value object.
Enumerator:
nullValue | 'null' value |
intValue | signed integer value |
uintValue | unsigned integer value |
realValue | double value |
stringValue | UTF-8 string value. |
booleanValue | bool value |
arrayValue | array value (ordered list) |
objectValue | object value (collection of name/value pairs). |
//从root中提取数据,基本模式如下函数所示,其中PARAM out只是抽象的占位符,代表用来保存从Value中提取的数据的对象,并不是一个实际实现的类。
static void
printValueTree( FILE *fout, Json::Value &value, const std::string &path = "." )
{
switch ( pe() )
{
case Json::nullValue:
fprintf( fout, "%s=null\n", path.c_str() );
break;
case Json::intValue:
fprintf( fout, "%s=%d\n", path.c_str(), value.asInt() );
break;
case Json::uintValue:
fprintf( fout, "%s=%u\n", path.c_str(), value.asUInt() );
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" );
python json字符串转数组 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( MemberNames() );
std::sort( members.begin(), d() );
std::string suffix = *(d()-1) == '.' ? "" : ".";
for ( Json::Value::Members::iterator it = members.begin();
it != d();
++it )
{
const std::string &name = *it;
printValueTree( fout, value[name], path + suffix + name );
}
}
break;
default:
break;
}
}
从内存中创建Value对象
在需要将内存数据转换为JSON时就需要从内存中创建一个Value对象,然后再转化为文本进行输出。
如果是一个简单的Value值,如布尔、数值、空值、字符串等,则直接使用构造函数创建Value。如:Value(datatype);
如果要创建一个对象类型的Value,首先使用
Value root(ValueType type = objectValue)
声明一个空的类型为对象的Value对象。
然后使用类似于root[“type”] = “USER_INFO”的表达式,往root中添加属性(key/value对)。
如果要创建一个数组类型的Value,首先使用
Value root(ValueType type = arrayValue)
声明一个空的类型为数组的Value对象。
然后使用root.append(Value&)成员,在数组的末尾追加一个值,或者使用root[index]来访问数组的元素。如果index值超出了当前数组的长度,那么将会在数组末尾追加一个元素,并返回这个元素的引用。
要创建代表如下JSON文档的Value对象:
{
"Type": "USER_INFO",
"Data": {
"id": 1,
"name": "spring",
"server": {
"homeserver": 1001,
"vistserver": 1003
},
"skillids": [
1,
3,
5
]
}
}
需要如下代码:
//声明object类型的对象,根对象
Value root(objectValue);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论