Jsoncpp 用法速查

 1.Jsoncpp简介 

Jsoncpp 是一个用于处理 JSON 数据的 C++ 库。它提供了将 JSON 数据序列化为字符串以及从字符串反序列化为 C++ 数据结构的功能。Jsoncpp 是开源的,广泛用于各种需要处理 JSON 数据的 C++ 项目中。

特性:
1. 简单易用:Jsoncpp 提供了直观的 API,使得处理 JSON 数据变得简单。
2. 高性能:Jsoncpp 的性能经过优化,能够高效地处理大量 JSON 数据。
3. 全面支持:支持 JSON 标准中的所有数据类型,包括对象、数组、字符串、数字、布尔值和null
4. 错误处理:在解析 JSON 数据时,Jsoncpp 提供了详细的错误信息和位置,方便 开发者调试

当使用 Jsoncpp 库进行 JSON 的序列化和反序列化时,存在不同的做法和工具类可供选择。下面是对 Jsoncpp 中序列化和反序列化操作的详细介绍。

安装

ubuntu:sudo apt-get install libjsoncpp-dev
Centos: sudo yum install jsoncpp-devel

2.Json::Value

Json::Value 是 Jsoncpp 库中的一个重要类,用于表示和操作 JSON 数据结构。以下是一些常用的 Json::Value 操作。

2.1.构造函数

Json::Value()	创建空值(null 类型)
Json::Value(ValueType type)	指定类型创建(如 intValue, stringValue)
Json::Value(int value)	直接构造整数类型值
Json::Value(const char* value)	直接构造字符串类型值
Json::Value nullVal;          // null
Json::Value intVal(42);       // 整数
Json::Value strVal("hello");  // 字符串

2.2.访问元素

对象访问

operator[](const char*)	通过键访问(自动创建不存在的键)
at(const char*)	通过键访问(不存在时抛出异常)
get(const char*, const Value& default)	安全访问(带默认值)
若该键不存在或类型不匹配,会返回传入的 default
Json::Value obj;
obj["name"] = "Alice";  // 自动创建
std::string name = obj.at("name").asString();  // 安全访问
int age = obj.get("age", Json::Value(18)).asInt();

数组访问

operator[](ArrayIndex)	通过索引访问(自动扩展数组)
append(const Value&)	向数组末尾添加元素
Json::Value arr;
arr.append(1);
arr.append("two");
int first = arr[0].asInt();  // 获取第一个元素

2.3.类型检查

bool isNull():检查值是否为 null。
bool isBool():检查值是否为布尔类型。
bool isInt():检查值是否为整数类型。
bool isInt64():检查值是否为 64 位整数类型。
bool isUInt():检查值是否为无符号整数类型。
bool isUInt64():检查值是否为 64 位无符号整数类型。
bool isIntegral():检查值是否为整数或可转换为整数的浮点数。
bool isDouble():检查值是否为双精度浮点数。
bool isNumeric():检查值是否为数字(整数或浮点数)。
bool isString():检查值是否为字符串。
bool isArray():检查值是否为数组。
bool isObject():检查值是否为对象(即键值对的集合)。

2.4.类型转换

bool asBool():将值转换为布尔类型(如果可能)。
int asInt():将值转换为整数类型(如果可能)。
Int64 asInt64():将值转换为 64 位整数类型(如果可能)。
unsigned int asUInt():将值转换为无符号整数类型(如果可能)。
UInt64 asUInt64():将值转换为 64 位无符号整数类型(如果可能)。
double asDouble():将值转换为双精度浮点数类型(如果可能)。
std::string asString():将值转换为字符串类型(如果可能)

2.5.对象操作

size_t size():返回数组或对象中的元素数量。
bool empty():检查数组或对象是否为空。
void resize(ArrayIndex newSize):调整数组的大小。
void clear():删除数组或对象中的所有元素。
void append(const Json::Value& value):在数组末尾添加一个新元素。

2.6.核心序列化/反序列化工具

Json::Reader	旧版 JSON 解析器(已弃用,建议用 CharReader)
Json::CharReader	新版 JSON 解析器(配合 CharReaderBuilder 使用)
Json::CharReaderBuilder	配置和创建 CharReader 的工厂类
Json::FastWriter	生成紧凑格式(无缩进)JSON 字符串
Json::StyledWriter	生成美化格式(带缩进)JSON 字符串
Json::StreamWriter	可定制的 JSON 生成器(配合 StreamWriterBuilder 使用)
Json::StreamWriterBuilder	配置和创建 StreamWriter 的工厂类

3.序列化

序列化指的是将数据结构或对象转换为一种格式,以便在网络上传输或存储到文件中。Jsoncpp 提供了多种方式进行序列化。

3.1.Json::Value 的 StyledString 方法

将 Json::Value 对象直接转换为格式化的 JSON 字符串

核心方法:

std::string write(const Json::Value& root)

传入 Json::Value 对象,返回美化格式的 JSON 字符串。

美化格式生成 的便捷方法:toStyledString

示例:

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

int main()
{
    Json::Value root;
    root["name"] = "jack";
    root["age"] = "18";

    Json::StyledWriter writer; // StyledWriter 构造无需参数
    std::string s = writer.write(root);
    std::string ss = root.toStyledString();

    std::cout << s << std::endl;
    std::cout << ss << std::endl;
    return 0;
}

2.2.Json::FastWriter

优点:比 StyledWriter 更快,因为它不添加额外的空格和换行符。

核心方法:

std::string write(const Json::Value& root)

传入 Json::Value 对象,返回紧凑格式的 JSON 字符串。

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

int main()
{
    Json::Value root;
    root["name"] = "Jack";
    root["age"] = "18";

    Json::FastWriter fwriter;
    std::string s = fwriter.write(root);

    std::cout << s << std::endl;
}

2.3.Json::StreamWriter

优点:提供了更多的定制选项,如缩进、换行符等。

(1)Json::StreamWriterBuilder

核心作用:

作为 StreamWriter 的 “工厂”,负责配置 JSON 输出格式(如缩进、换行符、每行长度等),并创建对应的 StreamWriter 实例。所有格式配置都通过它完成。

关键配置参数(通过 operator[] 设置)

参数名类型说明默认值
indentationstd::string缩进字符(如 "\t" 表示制表符," " 表示两个空格,"" 表示无缩进)"\t"
lineLengthunsigned int每行最大长度(超过则自动换行,0 表示不限制)74
commentStylestd::string注释风格("None" 表示不保留注释,"All" 表示保留所有注释)"None"
emitUTF8bool是否强制输出 UTF-8 编码(非 ASCII 字符不转义)true
dropNullPlaceholdersbool是否删除值为 null 的字段false

用法步骤:

 - 创建 StreamWriterBuilder 对象。
 - 通过 builder["参数名"] = 值 配置格式(可选,默认已有合理配置)。
 - 调用 builder.newStreamWriter() 创建 StreamWriter 实例(返回std::unique_ptr<StreamWriter>)

(2)Json::StreamWriter(流式生成器:执行写入)

基于 StreamWriterBuilder 的配置,将 Json::Value 中的 JSON 数据流式写入输出流(如文件流 std::ofstream、标准输出 std::cout 等),无需在内存中存储完整 JSON 字符串,适合处理大型 JSON 数据。

核心方法:

void write(const Json::Value& root, std::ostream* sout);

root:待序列化的 Json::Value 对象(内存中的 JSON 数据)。
sout:输出流指针(如文件流、网络流等),JSON 数据会直接写入该流。

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

int main()
{
    Json::Value root;
    root["name"] = "Jack";
    root["age"] = "18";
    root["hobbbies"].append("football");
    root["hobbiese"].append("swim");

    Json::StreamWriterBuilder builder;
    builder["indentation"] = "";  // 缩进为空字符串,取消缩进
    builder["lineLength"] = 0;    // 不限制每行长度,避免自动换行

    std::unique_ptr<Json::StreamWriter> writer(builder.newStreamWriter());
    std::stringstream ss;

    // writer->write(root, &ss);
    // std::cout << ss.str() << std::endl;

    writer->write(root, &std::cout);
    std::cout << std::endl;
}

StreamWriterBuilder():用于配置 JSON 输出的格式(如缩进、编码等)。

newStreamWrite():生成一个 StreamWriter 实例,用于将 Json::Value 写入输出流。

writer->write():将 Json::Value 对象(root)写入输出流(ss)。

4.反序列化

反序列化指的是将序列化后的数据重新转换为原来的数据结构或对象。Jsoncpp 提供了以下方法进行反序列化:

Json::CharReader

优点:提供详细的错误信息和位置,方便调试。

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

int main()
{
    std::string json_string = "{\"name\":\"Jack\", \"age\":30, \"city\":\"北京\"}";

    Json::Value root;
    std::string errs;

    // 新版解析器:CharReaderBuilder + CharReader
    Json::CharReaderBuilder builder;
    std::unique_ptr<Json::CharReader> reader(builder.newCharReader());

    // 解析 JSON 字符串(参数:起始地址、结束地址、输出root、错误信息)
    bool parse_success = reader->parse(
        json_string.c_str(),
        json_string.c_str() + json_string.size(),
        &root,
        &errs);

    if (!parse_success)
    {
        std::cout << "Failed to parse JSON: " << errs << std::endl;
        return 1;
    }

    std::string name = root["name"].asString();
    int age = root["age"].asInt();
    std::string city = root["city"].asString();
    
    std::cout << "Name: " << name << std::endl;
    std::cout << "Age: " << age << std::endl;
    std::cout << "City: " << city << std::endl;

    return 0;
}

reader.parse() 方法将 JSON 字符串解析为 Json::Value 对象(root)。

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值