C++ Jsoncpp

#include <json/json.h>
#include <iostream>

// create Json::value and serial to string
void Test(){
    Json::Value root;
    root.append("tom");
    root.append("jerry");
    root.append(true);
    root.append(20);

    Json::Value subArray;
    subArray.append("1");
    subArray.append("2");
    subArray.append("3");
    root.append(subArray);

    Json::Value subObject;
    subObject["name"] = "C++";
    subObject["lib"] = "Jsoncpp";
    root.append(subObject);

    std::string serialStr = root.toStyledString(); // 序列化为字符串,包含换行符
    std::cout<<serialStr<<std::endl;
    /*
        [
        "tom",
        "jerry",
        true,
        20,
        [
            "1",
            "2",
            "3"
        ],
        {
            "lib" : "Jsoncpp",
            "name" : "C++"
        }
    ]
    */

    Json::FastWriter wt; //deprecated
    std::string noEnterSerailStr = wt.write(root); // 无换行输出
    std::cout<<noEnterSerailStr<<std::endl;
    /*
        ["tom","jerry",true,20,["1","2","3"],{"lib":"Jsoncpp","name":"C++"}]
    */
}

// parse Json::value object
void ParseJsonValue(Json::Value value) {
    if (value.isNumeric()){
        std::cout<<value<<std::endl;
    }
    else if (value.isBool()) {
        std::cout<<value<<std::endl;
    }
    else if (value.isString()) {
        std::cout<<value.asString()<<std::endl;
    }
    else if (value.isArray()) {
        for (unsigned i = 0; i<value.size(); ++i) {
            ParseJsonValue(value[i]);
        }
    }
    else if (value.isObject()) {
        auto members = value.getMemberNames();
        for (auto it: members) {
            std::cout<<it<<":";
            ParseJsonValue(value[it]);
        }
    }else {
        //
    }

}
// 反序列化
void Test1()
{
    Json::Value obj;
    Json::Reader read;
    read.parse("[\"tom\",\"jerry\",true,20,[\"1\",\"2\",\"3\"],{\"lib\":\"Jsoncpp\",\"name\":\"C++\"}]",obj);
    ParseJsonValue(obj);
}
int main() {
    //Test();
    Test1();
}
### C++ 中使用 JsonCpp 进行 JSON 解析和生成 #### 1. 下载并配置 JsonCppJsonCpp 是一个用于处理 JSON 数据的跨平台开源库。可以访问其官方网站下载源码[^1]。为了在项目中集成该库,需完成以下操作: - **Windows 平台**: 将 JsonCpp 的头文件目录添加到项目的包含路径,并链接预编译好的静态或动态库。 - **Linux 平台**: 可通过包管理器安装 `libjsoncpp-dev` 或自行编译。 如果希望简化流程,可考虑将 JsonCpp 静态库嵌入至项目中,从而减少依赖项[^3]。 --- #### 2. 基本概念与核心类介绍 JsonCpp 提供的核心组件包括以下几个部分: - **`Json::Value`**: 表示 JSON 数据结构中的节点,支持多种数据类型(字符串、整数、浮点数、布尔值等)。 - **`Json::Reader` 和 `Json::Writer`**: 分别负责读取和写入 JSON 数据。 以下是基本的操作方法说明: --- #### 3. JSON 解析实例 下面展示了一个完整的解析过程,演示如何从 JSON 字符串提取字段值[^2]: ```cpp #include <iostream> #include "json/json.h" int main() { // 定义 JSON 字符串 std::string strJson = "{\"id\":113,\"name\":\"John\",\"scores\":99.99}"; // 创建 Reader 对象 Json::Reader reader; Json::Value root; // 解析 JSON 字符串 if (reader.parse(strJson, root)) { int id = root["id"].asInt(); std::string name = root["name"].asString(); double scores = root["scores"].asDouble(); std::cout << "ID: " << id << "\n"; std::cout << "Name: " << name << "\n"; std::cout << "Scores: " << scores << "\n"; } else { std::cerr << "Failed to parse JSON string.\n"; } return 0; } ``` 上述代码展示了如何利用 `Json::Reader` 来解析 JSON 字符串,并从中获取指定键对应的值。 --- #### 4. JSON 生成功能 除了解析现有 JSON 数据外,还可以借助 `Json::Value` 动态构建新的 JSON 结构,并将其序列化为字符串形式: ```cpp #include <iostream> #include "json/json.h" #include <fstream> int main() { // 构建 JSON 数据 Json::Value root; root["id"] = 113; root["name"] = "Alice"; root["scores"] = 87.5; // 使用 StyledWriter 输出带缩进的 JSON 字符串 Json::StyledWriter writer; std::string output = writer.write(root); // 打印结果 std::cout << output << std::endl; // 如果需要保存到文件 std::ofstream outFile("output.json"); if (outFile.is_open()) { outFile << output; outFile.close(); } return 0; } ``` 此片段实现了创建一个新的 JSON 节点树,并通过 `Json::StyledWriter` 将其转换成易于阅读的形式。 --- #### 5. 错误处理机制 当调用 `parse()` 方法时,可能会因输入格式错误而失败。此时可以通过检查返回值以及打印详细的错误消息来定位问题所在: ```cpp if (!reader.parse(strJson, root)) { std::cerr << "Error parsing JSON: " << reader.getFormattedErrorMessages() << std::endl; } ``` 以上方式能够帮助开发者快速发现潜在语法问题。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值