Jsoncpp库使用说明
    Jsoncpp是一个使用C++语言实现的面向对象的json
    Jsoncpp提供的接口中有3个核心类:ReaderWriterValue
    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小时内删除。