Nlohmann::json 关于解析字符串常见问题

前言

        前面介绍了关于nlohmann的关于结构体(类)与JSON的相互转换。

        这次我们介绍关于JSON字符串解析的常见问题

 解析函数parse()

nlohmann::json::parse(std::string& str)

parse是nlohamnn的静态函数,它能够解析json字符串,但是如果字符串为空,则会抛出异常

异常捕获

try
{
    std::string nullStr = "";
    nlohmann::json js = nlohmann::json::parse(nullStr);
}
catch(nlohmann::json::parse_error e)
{
    // ...自定义操作
}
catch(nlohmann::json::exception e)
{
    // ...自定义操作
}

通过nlohmann::json::parse_error来捕获解析错误

JSON转结构体的基本规则

http://t.csdnimg.cn/j4Xn4中,介绍了,json字符串与结构体(类)时,转换成员是可选择的。

在使用带初始值的宏时,json字符串还可以不包含 需要转换的成员。

nlohmann::json 完成json转结构体主要是依靠成员变量名称和变量类型的。

首先我们知道json由两种数据结构组成——对象(“{ }”)和数组(“[ ]”),其余就是键值对。

下面是转换时的对应规则

JSON结构体(类)
数字int/float等
字串string
逻辑值bool
对象struct(class)
nullnull
数组vector

在转换时会依照规则进行组装数据;

下面演示数组的转换:

#include "iostream"
#include "myStruct.h"
#include "json.hpp"
#include "vector"
using namespace std;

struct People
{
    // std::string name = "asd";
    // int age = 123;
    // std::string sex = "man";
    // int height = 190;
    std::string name = "asd";
    int age = 1;
    std::string sex = "dfg";
    int height = 2;

    NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(People, name, age)
};

int main(void)
{
    std::vector<People> ve;

    for (int i = 1; i < 10; i++)
    {
        People pe;
        ve.emplace_back(pe);
    }

    nlohmann::json js = ve;
    cout << js.dump() << endl;
    return 0;
}

执行结果

[{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"},{"age":1,"name":"asd"}]

转换函数get<>()

在使用转结构体函数get<>()时,是最容易发生崩溃的。为什么?

在上一节中,我们知道在json中值也是有类型的,同时我们也知道 转换是将成员变量名与键名进行对应,在这个对应中,如果json的值类型与对应的结构体成员变量的类型不一致,怎会出现崩溃和报错

nlohmann::json是一个开源的C++库,用于解析和处理JSON数据。它提供了简单易用的API,可以方便地将JSON数据解析C++对象,并且可以轻松地将C++对象转换为JSON格式。 要使用nlohmann::json解析文件,首先需要包含头文件`#include <nlohmann/json.hpp>`。然后,可以使用`nlohmann::json`类型的对象来表示JSON数据,并使用该对象的成员函数来解析文件。 以下是解析文件的基本步骤: 1. 打开文件并读取JSON数据。 2. 使用`nlohmann::json`对象来解析JSON数据。可以使用`json::parse()`函数将JSON字符串解析为`nlohmann::json`对象。 3. 使用`nlohmann::json`对象的成员函数来访问和处理JSON数据。 下面是一个简单的示例代码,演示了如何使用nlohmann::json解析文件: ```cpp #include <iostream> #include <fstream> #include <nlohmann/json.hpp> int main() { // 打开文件并读取JSON数据 std::ifstream file("data.json"); std::string jsonData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); // 使用nlohmann::json对象解析JSON数据 nlohmann::json json = nlohmann::json::parse(jsonData); // 访问和处理JSON数据 std::string name = json["name"]; int age = json["age"]; // 输出解析结果 std::cout << "Name: " << name << std::endl; std::cout << "Age: " << age << std::endl; return 0; } ``` 请注意,上述示例代码假设文件名为"data.json",并且文件中包含以下JSON数据: ```json { "name": "John", "age": 25 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一直在找资料的菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值