菜鸟笔记
提升您的技术认知

jsoncpp 使用详细教程,避坑必看-ag真人游戏

json和jsoncpp是什么这里就不多余介绍了,大概知道就行,各位想详细了解的话可以自行搜索。

1.jsoncpp库下载
jsoncpp的代码在github上开源,可以前往github下载源代码加入到项目中使用。

也可以编译为静态/动态库使用。

源码地址:https://github.com/open-source-parsers/jsoncpp

访问不了的话可以自行百度下载。

2.jsoncpp使用
1.常用类介绍
1. json::value

按照字面字面意思理解,就是jsoncpp里定义的一种值
值的类型有以下几种:

enum valuetype
   {
      nullvalue = 0, ///< '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).
   };

tips 1. 对象类型的value由一到多个键值对组成,每个键值对的值可以是任意类型。

tips 2. 数组中的项也可以是任意类型,可以任意混搭。

tips 3. 多个键值对 或 多个数组的项 之间用逗号‘,’隔开,最后一个键值对(数组的项)后不要加逗号。

tips 4. json文件可以用vs code一键格式化,方便实用。有红波浪线的地方就是有错误,会parse失败。

值对象的类型可以通过 type() 方法获取。
value.type();

2. json::reader
json解释器,可以使用 parse() 方法将json格式的字符串解析成json::value

  

  string str;        // json格式的字符串
    json::value value;
    json::reader reader;
    if (!reader.parse(str, value)) {
        // 解析失败
    }

3. json::fastwriter 和 json::stylewriter
可以将json::value转换为字符串。其中fastwriter结果是无格式的字符串。而stylewriter是格式化的字符串。   

 string str;
    json::value value;
    value["exp"] = "jsoncpp使用示例";
    json::fastwriter fwriter;
    str = fwriter.write(value);     // str = "{"exp":"jsoncpp使用示例"}\n"
    json::styledwriter swriter;
    str = swriter.write(value);     // str = "{\n   \"exp\" : \"jsoncpp使用示例\"\n}\n";

其中转换为格式化字符串也可以使用json::value的 tostylestring() 方法。

str = value.tostyledstring();

2.常用函数介绍

value &operator[]( uint index );
const value &operator[]( uint index ) const;
value &operator[]( const char *key );
const value &operator[]( const char *key ) const;
value &operator[]( const std::string &key );
const value &operator[]( const std::string &key ) const;
value &operator[]( const staticstring &key );

[] 里可以传入 char * 或 string 等其他字符串作为 key 取得对应的值。也可以传入非负整数作为索引取得值。

但是需要注意的是,只有当value的类型是 nullvalue 或 objectvalue 时才可以传入字符串调用 [] 操作符,否则会触发assert错误中断。
当 value 类型为 nullvalue 或 arrayvalue 时才可以传入uint作为索引调用 [] 操作符。

2. bool isnull() const;
判断type()是否为nullvalue,是则返回true,否则返回false。
效果等同于bool operator!() const;操作符。

bool ret = value["null"].isnull();
str = value.tostyledstring();

但是这样使用会先调用重载的 [] 符号,如果传入的 key 值不存在,就会创建一个新的空键值对。

3. members getmembernames() const;
获取json::value的键列表,本质是字符串向量。

typedef std::vector json::value::members;

tips: 当value的类型是 objectvalue 或 nullvalue 时才可以使用此函数,否则会报运行时错误。因此,收到value时一定要先判断类型处理,不要一上来就getmembernames()。

json::value::members mem = value.getmembernames();

4. uint size() const;
如果类型是数组或对象,则返回数组或对象的大小;其他类型返回0。

5. bool empty() const;
如果是数组或对象类型,size()为0则返回true;
如果是nullvalue类型,返回true;
剩下类型返回false。

6. bool ismember( const char *key ) const;

bool ismember( const std::string &key ) const;

判断 value 是否包含传入的字符串作为 key 的键值对。
包含则返回 true
不包含则返回 false

7. value removemember( const char* key );
移除字符串作为 key 的键值对。
返回被移除的键值对的值。
不存在该键值对则返回null。

仅当 value 的类型是 nullvalue 或 objectvalue 时可调用此函数,否则会assert错误触发中断。

8. value &append( const value &value );
添加value到数组的结尾

仅当 value 的类型为 nullvalue 或 arrayvalue 时才可调用此函数,否则会assert错误触发中断。

3. 遍历json::value
遍历方法如下:

入口处先判断一下类型

value.type() == json::objectvalue ? objectvalue(value) : typeswitch(value);
void objectvalue(json::value &value)
{
    json::value::members mem = value.getmembernames();
    for (auto iter = mem.begin(); iter != mem.end(); iter  ) {
        printf("%s : ", (*iter).c_str());       // 打印键名
        typeswitch(value[*iter]);
    }
}

void typeswitch(json::value &value)
{
    switch (value.type())
    {
        case json::objectvalue :
            objectvalue(value);
            break;
        case json::arrayvalue :
        {
            auto count = value.size();
            for (unsigned int i = 0; i < count; i  )
                typeswitch(value[i]);
        }
            break;
        case json::stringvalue :
            printf("%s\n", value.asstring().c_str());
            break;
        case json::realvalue :
            printf("%lf\n", value.asdouble());
            break;
        case json::uintvalue :
            printf("%u\n", value.asuint());
            break;
        case json::intvalue :
            printf("%d\n", value.asint());
            break;
        case json::booleanvalue :
            printf("%d\n", value.asbool());
            break;
        default :
            break;
    }
}

如过想要根据 key 值寻找特定键值对的话,可以修改一下 objectvalue() ,然后递归调用。

3.总结
jsoncpp中提供的方法非常丰富全面,源码也对新人比较友好,可以多加阅读。

网站地图