当前位置: 首页 > news >正文

JsonCpp 处理 JSON(现代 C++ 方案)(三)

第三部分:JsonCpp 处理 JSON(现代 C++ 方案)

📢 快速掌握 JSON!文章 + 视频双管齐下 🚀

如果你觉得阅读文章太慢,或者更喜欢 边看边学 的方式,不妨直接观看我录制的 JsonCpp 课程视频!🎬 视频里会用更直观的方式讲解 JsonCpp 的核心概念、实战技巧,并配有动手演示,让你更高效地掌握 JSON 的处理方法!

当然,如果你喜欢深度阅读,这篇文章会帮助你系统地理解 JsonCpp,从基础到进阶!无论你选择哪种方式,最终目标都是让你成为 JsonCpp 处理的高手!💪

🎥 点击这里观看视频 👉 视频链接

一:JsonCpp 库概述与环境配置

1.1 JsonCpp 简介(特点、适用场景)

📌 JSONCPP 是什么?

  • JSONCPP 是一个 轻量级、功能强大 的 C++ JSON 解析库。
  • 它提供了 读取、修改、序列化、反序列化 JSON 的功能。
  • 适用于 嵌入式系统、网络编程、配置管理、日志处理 等场景。

📌 JSONCPP 的特点

易用:提供直观的 Json::Value 结构,操作 JSON 类似于操作 std::map
功能全面:支持 解析、创建、修改、格式化输出
性能优越:支持 高效的流式解析,适合处理大规模 JSON 数据

1.2 下载和安装 JsonCpp(CMake / vcpkg)

安装 JSONCPP

💡 方法 1:在windows中使用 vcpkg 安装

# powershell

vcpkg install jsoncpp

💡 方法 2:在linux/macOS中使用系统包管理器

# Ubuntu/Debian
sudo apt install libjsoncpp-dev
# CentOS
sudo yum install jsoncpp         
# macOS
brew install jsoncpp

💡 方法 3:使用源码编译

git clone https://github.com/open-source-parsers/jsoncpp.git
cd jsoncpp
mkdir build && cd build
cmake .. && make
sudo make install

CMake 集成

# 安装了jsoncpp库的情况
cmake_minimum_required(VERSION 3.10)
project(MyProject)

# 查找 jsoncpp 库
find_package(jsoncpp REQUIRED)

# 包含头文件目录
include_directories(${JSONCPP_INCLUDE_DIRS})

# 链接 jsoncpp 库
target_link_libraries(MyExecutable ${JSONCPP_LIBRARIES})

1.3 在 C++ 项目中集成 JsonCpp

另一种方式,会在目录下生成一个dist文件夹,在文件夹下包括jsoncpp的头文件和源文件;直接拷贝源文件到项目中即可。

python3 amalgamate.py

二:使用 JsonCpp 解析 JSON

2.1 加载JSON字符串
  • 解析 JSON 字符串:

    JsonCpp 提供了一个 Json::CharReader 用于解析 JSON 字符串,返回一个 Json::Value 对象。该对象是一个可以操作的 JSON 数据结构。

  • 解析 JSON 字符串并输出

    以下代码展示了如何解析一个 JSON 字符串,并将其内容打印出来(包括格式化输出)。

    示例代码:
    #include <iostream>
    #include <json/json.h>
    #include <fstream>
    
    int main() {
         
        // 示例 JSON 字符串
        std::string jsonString = R"({
            "name": "John",
            "age": 30,
            "city": "New York",
            "isEmployed": true,
            "skills": ["C++", "Python", "Java"]
        })";
    
        // 创建 Json::CharReaderBuilder,用于解析 JSON 字符串
        Json::CharReaderBuilder readerBuilder;
        Json::Value root;
        std::string errs;
    
        // 解析 JSON 字符串
        std::istringstream iss(jsonString);
        if (Json::parseFromStream(readerBuilder, iss, &root, &errs)) {
         
            // 解析成功,输出 JSON 内容
            std::cout << "Parsed JSON: " << std::endl;
    
            // 创建 StreamWriterBuilder,用于输出格式化的 JSON 字符串
            Json::StreamWriterBuilder writerBuilder;
            writerBuilder["indentation"] = "    "; // 设置缩进为4个空格
            std::string jsonStr = Json::writeString(writerBuilder, root);
    
            // 输出格式化后的 JSON 字符串
            std::cout << jsonStr << std::endl;
        } else {
         
            // 解析失败,输出错误信息
            std::cout << "Failed to parse the JSON string." << std::endl;
            std::cout << "Error: " << errs << std::endl;
        }
    
        return 0;
    }
    
    解释:
    1. JSON 字符串jsonString 变量保存了一个 JSON 格式的字符串。
      • R"(...)" 是 C++11 引入的原始字符串字面量,用于避免转义字符。
      • JSON 字符串中包括了 nameagecityisEmployedskills 等字段。
    2. Json::CharReaderBuilder:用于配置 JSON 解析器。Json::parseFromStream 方法从输入流中解析 JSON 字符串,并将解析后的内容存储到 root 对象中。
    3. 解析 JSON 字符串Json::parseFromStream 方法解析输入流中的 JSON 字符串,返回 true 表示解析成功,false 表示解析失败。
    4. 输出 JSON 数据
      • 使用 Json::StreamWriterBuilder 构建输出流,以便输出格式化的 JSON 字符串。
      • 设置 indentation" "(四个空格),使输出具有缩进和易于阅读的格式。
    5. 输出结果
      • 如果解析成功,将输出格式化后的 JSON 字符串。
      • 如果解析失败,输出错误信息。
    示例输出:
    Parsed JSON:
    {
         
        "age": 30,
        "city": "New York",
        "isEmployed": true,
        "name": "John",
        "skills": [
            "C++",
            "Python",
            "Java"
        ]
    }
    
    总结:
    • Json::CharReaderBuilder 用于配置 JSON 解析器,并从输入流解析 JSON 字符串。
    • Json::StreamWriterBuilder 用于控制输出 JSON 字符串的格式(如缩进、空格数等)。
    • Json::Value 存储解析后的 JSON 数据,允许进行读取、修改、输出等操作。
2.2 解析JSON数组

JsonCpp 支持解析 JSON 数组,数组元素可以是任意类型的数据(如字符串、数字、对象、嵌套数组等)。

示例:

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

int main() {
   
    std::string jsonString = R"([{"name":"John", "age":30}, {"name":"Alice", "age":25}])";
    
    Json::CharReaderBuilder readerBuilder;
    Json::Value root;
    std::istringstream s(jsonString);
    std::string errs;

    if (Json::parseFromStream(readerBuilder, s, &root, &errs)) {
   
        for (const auto& item : root) {
   
            std::cout << "Name: " << item["name"].asString() << ", Age: " &l

相关文章:

  • WPF基础知识
  • 关于VUE中v-model响应式失效的问题
  • Spring相关面试题总结
  • docker打包使用有头模式playwright
  • 【开题报告+论文+源码】基于springboot加vue 前后端分离的校园新闻审核发布管理系统
  • 鸿蒙NEXT小游戏开发:记忆翻牌
  • 网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.3 ret2syscall
  • 【C++进阶四】vector模拟实现
  • 蓝桥杯省模拟赛 数位和
  • 使用LangChain Agents构建Gradio及Gradio Tools(3)——使用Langchain agents构建Gradio UI
  • AI-人工智能-多模态学习助力精准预测心脏毒性
  • 使用Hugging Face训练自定义重排模型(Reranker)完全指南
  • 2024年蓝桥杯Java B组省赛真题超详解析-分布式队列
  • Docker中安装MySQL--------【详细图解】
  • Vue2函数式组件实战:手写可调用的动态组件,适用于toast轻提示、tip提示、dialog弹窗等
  • 掌握AI营销:移动营销的新动力
  • c++:哈希表
  • GPT-4o推出的原生图像生成功能升级后有点东西!
  • 世界通信大会、嵌入式展及慕尼黑上海光博会亮点回顾
  • 手绘风格流程图工具:简单高效的在线流程图绘制工具
  • 王毅谈金砖国家开展斡旋调解的经验和独特优势
  • 国际油价重挫!美股道指连跌三月,啥情况?
  • “面具女孩”多次恐吓电梯内两幼童,当事女孩及家长道歉后获谅解
  • 抗美援朝老战士宁昭逝世,享年93岁
  • 国新办发布《关于新冠疫情防控与病毒溯源的中方行动和立场》白皮书
  • 徐徕任上海浦东新区副区长,此前已任区委常委