JsonCpp 使用详细教程,避坑必看

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::FastWriterJson::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.常用函数介绍

1. 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<std::string> Json::Value::Members;

Tips: 当value的类型是 objectValuenullValue 时才可以使用此函数,否则会报运行时错误。因此,收到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中提供的方法非常丰富全面,源码也对新人比较友好,可以多加阅读。

以上仅是我个人学习总结,欢迎各位一起探讨补充

  • 14
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jsoncpp是一个C++ JSON解析库,它可以将JSON数据转换为C++对象,也可以将C++对象转换为JSON数据。 下面是Jsoncpp使用详解: 1. 下载安装 你可以从Jsoncpp的官方网站下载最新的源代码,然后编译安装。也可以使用包管理器进行安装,如在Ubuntu下可以使用以下命令进行安装: ``` sudo apt-get install libjsoncpp-dev ``` 2. 解析JSON数据 Jsoncpp提供了一个Json::Value类,它可以表示JSON数据中的任何类型。使用Jsoncpp解析JSON数据的一般步骤如下: ```c++ #include <iostream> #include <jsoncpp/json/json.h> int main() { std::string json_str = "{\"name\": \"Tom\", \"age\": 18}"; Json::Value root; Json::CharReaderBuilder builder; Json::CharReader* reader = builder.newCharReader(); JSONCPP_STRING errors; bool parsing_successful = reader->parse(json_str.c_str(), json_str.c_str() + json_str.size(), &root, &errors); delete reader; if (!parsing_successful) { std::cerr << "Failed to parse JSON: " << errors << std::endl; return -1; } std::string name = root["name"].asString(); int age = root["age"].asInt(); std::cout << "Name: " << name << ", Age: " << age << std::endl; return 0; } ``` 上面的代码解析了一个JSON字符串,然后获取了其中的"name"和"age"字段的值。 3. 生成JSON数据 Jsoncpp可以将C++对象转换为JSON数据。下面是一个示例: ```c++ #include <iostream> #include <jsoncpp/json/json.h> int main() { Json::Value root; root["name"] = "Tom"; root["age"] = 18; Json::StreamWriterBuilder builder; builder["indentation"] = " "; // 设置缩进 std::cout << Json::writeString(builder, root) << std::endl; return 0; } ``` 上面的代码生成了一个JSON对象,然后将它转换为JSON字符串并输出。 4. 更多用法 Jsoncpp还提供了很多其他的用法,如数组、嵌套对象、注释等等。如果需要了解更多用法,请参考Jsoncpp的官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值