最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?中的?JSON?序列化和反序列化及結構體與枚舉類型的處理方法

 更新時間:2024年11月08日 12:11:08   作者:極地星光  
在?C++?編程中,處理?JSON?數(shù)據(jù)是一項常見任務,特別是在需要與其他系統(tǒng)或前端進行數(shù)據(jù)交換時,本文將詳細介紹如何使用?nlohmann::json?庫對結構體和枚舉類型進行序列化和反序列化,感興趣的朋友一起看看吧

在 C++ 編程中,處理 JSON 數(shù)據(jù)是一項常見任務,特別是在需要與其他系統(tǒng)或前端進行數(shù)據(jù)交換時。nlohmann::json 庫是一個功能強大且易于使用的 JSON 庫,它允許我們輕松地在 C++ 中進行 JSON 數(shù)據(jù)的序列化和反序列化。本文將詳細介紹如何使用 nlohmann::json 庫對結構體和枚舉類型進行序列化和反序列化。

一、結構體的 JSON 序列化和反序列化

1. 序列化方法 to_json

要將結構體轉換為 JSON 對象,我們需要定義一個 to_json 函數(shù)。這個函數(shù)接收一個 nlohmann::json 引用和一個結構體實例,并將結構體的字段填充到 JSON 對象中。

inline void to_json(nlohmann::json &j, const YourStruct &p)
{
    j = nlohmann::json{
        {"field1", p.field1},
        {"field2", p.field2},
        // 添加其他字段
    };
}

在這個例子中,YourStruct 是一個自定義的結構體,field1field2 是它的字段。通過 to_json 函數(shù),我們可以將 YourStruct 實例轉換為 JSON 對象。

2. 反序列化方法 from_json

要從 JSON 對象中提取數(shù)據(jù)并填充到結構體中,我們需要定義一個 from_json 函數(shù)。這個函數(shù)同樣接收一個 nlohmann::json 引用和一個結構體引用,并從 JSON 對象中提取數(shù)據(jù)并賦值給結構體的字段。

inline void from_json(const nlohmann::json &j, YourStruct &p)
{
    try {
        j.at("field1").get_to(p.field1);
        j.at("field2").get_to(p.field2);
        // 添加其他字段
    } catch (const nlohmann::json::exception& e) {
        // 處理解析錯誤,例如設置默認值或標記錯誤
        p.field1 = default_value1;
        p.field2 = default_value2;
        // 或者拋出異常
        // throw std::runtime_error("Failed to parse JSON: " + std::string(e.what()));
    }
}

在這個例子中,我們使用 try-catch 塊來捕獲可能的異常,例如 JSON 對象中缺少某個鍵。如果捕獲到異常,我們可以選擇設置默認值或拋出異常。

二、枚舉類型的 JSON 序列化和反序列化

處理枚舉類型的 JSON 序列化和反序列化時,我們可以使用 NLOHMANN_JSON_SERIALIZE_ENUM 宏來簡化工作。

enum class YourEnum {
    Value1,
    Value2,
    // 添加其他枚舉值
};
NLOHMANN_JSON_SERIALIZE_ENUM(YourEnum,
                             { { YourEnum::Value1, "Value1" },
                               { YourEnum::Value2, "Value2" },
                               // 添加其他枚舉值
                             })

在這個例子中,我們定義了一個枚舉類型 YourEnum,并使用 NLOHMANN_JSON_SERIALIZE_ENUM 宏來定義枚舉值的字符串表示形式。這樣,YourEnum::Value1 將被序列化為字符串 "Value1",反之亦然。

三、示例代碼

假設我們有兩個結構體 RobotMsgRtdeRecipe,以及兩個枚舉類型 RuntimeStateRobotModeType。以下是完整的示例代碼:

#include <nlohmann/json.hpp>
#include <vector>
#include <string>
#include <stdexcept>
// 引入 JSON 庫命名空間
using json = nlohmann::json;
// 枚舉類型定義及序列化
enum class RuntimeState {
    Running,
    Retracting,
    Pausing,
    Paused,
    Stopping,
    Stopped,
    Aborting
};
NLOHMANN_JSON_SERIALIZE_ENUM(RuntimeState,
                             { { RuntimeState::Running, "Running" },
                               { RuntimeState::Retracting, "Retracting" },
                               { RuntimeState::Pausing, "Pausing" },
                               { RuntimeState::Paused, "Paused" },
                               { RuntimeState::Stopping, "Stopping" },
                               { RuntimeState::Stopped, "Stopped" },
                               { RuntimeState::Aborting, "Aborting" } })
// 結構體定義及序列化/反序列化
struct RobotMsg {
    int64_t timestamp;
    int level;
    int code;
    std::string source;
    std::vector<std::string> args;
};
inline void to_json(json &j, const RobotMsg &p)
{
    j = json{
        {"timestamp", p.timestamp},
        {"level", p.level},
        {"code", p.code},
        {"source", p.source},
        {"args", p.args}
    };
}
inline void from_json(const json &j, RobotMsg &p)
{
    try {
        j.at("timestamp").get_to(p.timestamp);
        j.at("level").get_to(p.level);
        j.at("code").get_to(p.code);
        j.at("source").get_to(p.source);
        j.at("args").get_to(p.args);
    } catch (const json::exception& e) {
        // 解析無效
        p.code = -1;
        // 或者拋出異常
        // throw std::runtime_error("Failed to parse JSON: " + std::string(e.what()));
    }
}

到此這篇關于C++ 中的 JSON 序列化和反序列化:結構體與枚舉類型的處理的文章就介紹到這了,更多相關C++ JSON 序列化和反序列化內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Qt 數(shù)據(jù)庫QSqlDatabase使用示例

    Qt 數(shù)據(jù)庫QSqlDatabase使用示例

    本文主要介紹了Qt數(shù)據(jù)庫QSqlDatabase使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-12-12
  • C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內嵌的音視頻播放器

    C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內嵌的音視頻播放器

    這篇文章主要為大家詳細介紹了如何利用C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內嵌的音視頻播放器,并支持軟硬解碼,支持音頻,支持錄像截圖,支持多路播放等,感興趣的可以了解下
    2024-01-01
  • C++實現(xiàn)旋轉數(shù)組的二分查找

    C++實現(xiàn)旋轉數(shù)組的二分查找

    這篇文章主要介紹了C++實現(xiàn)旋轉數(shù)組的二分查找方法,涉及數(shù)組的操作,有值得借鑒的技巧,需要的朋友可以參考下
    2014-09-09
  • 探討:C++中函數(shù)返回引用的注意事項

    探討:C++中函數(shù)返回引用的注意事項

    本篇文章是對C++中函數(shù)返回引用的注意事項進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

    C++實現(xiàn)一個簡易版的事件(Event)的示例代碼

    之前在?windows系統(tǒng)中開發(fā)應用時,?遇到需要進行線程同步的時候幾乎都是使用的事件內核對象?Event。本文為大家整理了C++實現(xiàn)一個簡易版的事件(Event)的相關資料,需要的可以參考一下
    2022-11-11
  • C++類和對象補充

    C++類和對象補充

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數(shù)
    2021-10-10
  • 基于Windows API分解路徑問題的詳解

    基于Windows API分解路徑問題的詳解

    本篇文章是對Windows API分解路徑進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 一文帶你快速了解C/C++標準庫中的ptrdiff_t

    一文帶你快速了解C/C++標準庫中的ptrdiff_t

    ptrdiff_t是C/C++標準庫中定義的一個與機器相關的數(shù)據(jù)類型,ptrdiff_t類型變量通常用來保存兩個指針減法操作的結果,下面這篇文章主要給大家介紹了關于C/C++標準庫中ptrdiff_t的相關資料,需要的朋友可以參考下
    2022-11-11
  • C語言如何利用異或進行兩個值的交換詳解

    C語言如何利用異或進行兩個值的交換詳解

    最近在工作中遇到了兩個值交換的需求,發(fā)現(xiàn)自己對異或有些忘記,所以索性寫出來,方便以后需要的時候參考學習,下面這篇文章主要給大家介紹了關于C語言如何利用異或進行兩個值的交換的相關資料,需要的朋友可以參考下。
    2017-09-09
  • C/C++中二進制文件&順序讀寫詳解及其作用介紹

    C/C++中二進制文件&順序讀寫詳解及其作用介紹

    這篇文章主要介紹了C/C++中二進制文件&順序讀寫詳解及其作用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論

建宁县| 昌图县| 开原市| 河源市| 河西区| 商南县| 克东县| 尚义县| 开江县| 商水县| 扎赉特旗| 乐平市| 长治市| 澎湖县| 交城县| 康马县| 剑川县| 安多县| 师宗县| 永丰县| 湟源县| 黑龙江省| 湾仔区| 米林县| 额尔古纳市| 砚山县| 馆陶县| 抚州市| 新邵县| 陈巴尔虎旗| 连平县| 瓮安县| 寻甸| 遵义县| 米泉市| 香河县| 锡林浩特市| 瓮安县| 乐安县| 吐鲁番市| 徐水县|