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

JSON简介及C++中的JSON使用指南

1. 什么是JSON?

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用文本格式存储和传输数据。它易于人阅读和编写,同时也易于机器解析和生成。JSON广泛应用于Web API、配置文件、数据存储等领域。

JSON的特点

  • 轻量级:相比XML,JSON更加简洁,占用更少的带宽。
  • 易读性:采用键值对(key: value)结构,类似字典或哈希表。
  • 跨语言支持:几乎所有编程语言都支持JSON解析和生成。
  • 结构化数据:支持嵌套对象和数组,适合复杂数据表示。

JSON基本语法

JSON数据由以下几种结构组成:

  • 对象(Object):用 { } 包裹,键值对用 : 分隔,多个键值对用 , 分隔。
    {
      "name": "Alice",
      "age": 25,
      "isStudent": true
    }
    
  • 数组(Array):用 [ ] 包裹,元素之间用 , 分隔。
    ["apple", "banana", "orange"]
    
  • 值(Value):可以是字符串、数字、布尔值、null、对象或数组。

2. C++ 如何使用JSON?

C++标准库没有内置JSON支持,但可以使用第三方库来解析和生成JSON。常用的库有:

  1. nlohmann/json(推荐,简单易用)
  2. RapidJSON(高性能,适合嵌入式)
  3. JsonCpp(较老但仍广泛使用)

2.1 使用 nlohmann/json(推荐)

安装
  • 方法1:通过包管理器(如vcpkg、conan)安装:
    vcpkg install nlohmann-json
    
  • 方法2:直接包含头文件(单文件库):
    #include <nlohmann/json.hpp>
    using json = nlohmann::json; // 别名简化
    
基本用法
(1)解析JSON字符串
#include <iostream>
#include <nlohmann/json.hpp>

int main() {
    std::string jsonStr = R"(
        {
            "name": "Bob",
            "age": 30,
            "hobbies": ["reading", "gaming"]
        }
    )";

    // 解析JSON
    auto data = json::parse(jsonStr);

    // 访问数据
    std::cout << "Name: " << data["name"] << std::endl; // "Bob"
    std::cout << "Age: " << data["age"] << std::endl;   // 30
    std::cout << "Hobby 1: " << data["hobbies"][0] << std::endl; // "reading"

    return 0;
}
(2)生成JSON
#include <iostream>
#include <nlohmann/json.hpp>

int main() {
    json data;
    data["name"] = "Alice";
    data["age"] = 25;
    data["isStudent"] = true;
    data["courses"] = {"Math", "Physics"};

    // 转换为字符串
    std::string jsonStr = data.dump(4); // 4表示缩进(美化输出)
    std::cout << jsonStr << std::endl;

    return 0;
}

输出:

{
    "name": "Alice",
    "age": 25,
    "isStudent": true,
    "courses": ["Math", "Physics"]
}
(3)处理文件
#include <fstream>
#include <nlohmann/json.hpp>

int main() {
    // 从文件读取JSON
    std::ifstream input("data.json");
    json data;
    input >> data;

    // 修改数据
    data["age"] = 26;

    // 写回文件
    std::ofstream output("data_updated.json");
    output << std::setw(4) << data << std::endl;

    return 0;
}

2.2 使用 RapidJSON(高性能解析)

RapidJSON 是一个高效的C++ JSON解析库,适用于对性能要求较高的场景。

安装
  • 从 GitHub 下载:RapidJSON
  • 直接包含头文件:
    #include "rapidjson/document.h"
    #include "rapidjson/writer.h"
    #include "rapidjson/stringbuffer.h"
    
基本用法
#include <iostream>
#include "rapidjson/document.h"
#include "rapidjson/writer.h"
#include "rapidjson/stringbuffer.h"

int main() {
    const char* jsonStr = R"({"name":"Tom","age":20})";

    // 解析JSON
    rapidjson::Document doc;
    doc.Parse(jsonStr);

    // 访问数据
    std::cout << "Name: " << doc["name"].GetString() << std::endl;
    std::cout << "Age: " << doc["age"].GetInt() << std::endl;

    // 生成JSON
    rapidjson::StringBuffer buffer;
    rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
    writer.StartObject();
    writer.Key("name");
    writer.String("Jerry");
    writer.Key("age");
    writer.Int(22);
    writer.EndObject();

    std::cout << buffer.GetString() << std::endl;

    return 0;
}

3. 总结

对比项nlohmann/jsonRapidJSONJsonCpp
易用性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
性能⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
适用场景通用开发高性能解析旧项目兼容
  • 推荐使用 nlohmann/json:API友好,适合大多数C++项目。
  • 需要极致性能时用 RapidJSON:如高频JSON解析(游戏、嵌入式)。
  • 旧项目维护可用 JsonCpp:兼容性好,但性能较低。

http://www.kler.cn/a/610764.html

相关文章:

  • Flutter 常见错误和坑
  • skynet.netpack四个核心函数详解
  • 机器学习都有哪些算法?
  • Golang 的 Waitgroup 锁用 Java的话要怎么实现?
  • LIMS应用的意义-LIMS厂家排名推荐
  • 全分辨率免ROOT懒人精灵-自动化编程思维-设计思路-实战训练
  • Docker镜像迁移方案
  • Rust从入门到精通之入门篇:3.Hello World
  • [问题收集]mysql主从分离过程中,数据不同步可能导致的后果以及应对策略
  • Ubuntu 重置密码方法
  • Android studio无法查看源码
  • 2.4 Gannt图【甘特图】
  • 多级缓存和数据一致性问题
  • 鸿蒙Flutter开发故事:不,你不需要鸿蒙化
  • 宝塔docker flarum默认登录账号密码,crazymax/flarum镜像默认登录账号密码
  • 【leetcode hot 100 215】数组中的第K个最大元素
  • Python----计算机视觉处理(Opencv:梯度处理:filiter2D算子,Sobel,Laplacian)
  • 鸿蒙HarmonyOS NEXT之无感监听
  • WPF TextBox实现键盘enter后实时读取TextBox中的值
  • BP神经网络+NSGAII算法(保真)