国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C++】使用 nlohmann 解析 json 文件

這篇具有很好參考價值的文章主要介紹了【C++】使用 nlohmann 解析 json 文件。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

引言

nlohman json GitHub - nlohmann/json: JSON for Modern C++ 是一個為現(xiàn)代C++(C++11)設計的JSON解析庫,主要特點是

  • 易于集成,僅需一個頭文件,無需安裝依賴

  • 易于使用,可以和STL無縫對接,使用體驗近似python中的json

常見用法

1. json初始化

1.1 從文件初始化
std::ifstream in_file("test.json");
nlohmann::json doc;
if (!in_file.is_open()) {
    exit(1);
}
in_file >> doc;
in_file.close();
1.2 從字符串初始化

方式1

nlohmann::json doc = R"({"key1":"value1", "key2":[1,2,3]})"_json;
// nlohmann::json doc = "{\"key1\":\"value1\", \"key2\":[1,2,3]}"_json; // 此種情況下需要對json字符串中的雙引號進行轉(zhuǎn)義
  • R表示json字符串中的特殊字符均按照字符本身進行解析,而不需要進行轉(zhuǎn)義,如雙引號、反斜杠等字符

  • _json結(jié)尾表示其是一個json對象

方式2

std::string info = R"({"key1":"value1", "key2":[1,2,3]})";
nlohmann::json doc = nlohmann::json::parse(info);
  • 調(diào)用json::parse方法,通過傳入一個字符串進行構(gòu)造,此時不以 _json結(jié)尾
1.3 直接構(gòu)造json對象

方式1

// {"key1":"value1","key2":[1,2,3],"key3":{"key":"val"}}
nlohmann::json doc = {{"key1", "value1"}, {"key2", {1,2,3}}, {"key3", {{"key", "val"}}}};
  • 最外層的花括號表示一個json object

  • 里面的每一對花括號的第一個元素為key,第二個元素為value,用’,'分割

  • 注意:單對花括號包裹的是array,兩對花括號包裹的才是json object,如:

    • {1, 2}是一個array,即[1, 2]

    • {{1, 2}}是一個object,即{1:2},key為1,value為2

方式2

// {"app":"wechat","array":[1,2,4],"obj":{"age":15,"name":"zs","sex":"m"}}
nlohmann::json doc;
doc["app"] = "wechat";  // 添加一個k-v,若key存在則覆蓋value
doc["array"] = {1,2,3}; // 添加一個數(shù)組
doc["array"].emplace_back(4); // 數(shù)組添加一個元素
doc["array"].erase(2); // 刪除下標為2的元素
doc["obj"] = {{"name", "zs"}, {"age", 15}}; // 添加一個object
doc["obj"].push_back({"sex", "m"}); // 通過push方法添加一個k-v,若key存在則忽略,不會覆蓋value
doc.push_back({"app", "qq"}); // key存在,故忽略

2. json訪問

json展開如下:

{
  "retCode": 0,
  "retMSg": "成功",
  "data": [
    {
      "name": "李雷",
      "id": "001",
      "score": {
        "Chinese": 80,
        "Math": 95
      },
      "schoolInfo": [
        {
          "School_name": "清華"
        },
        {
          "School_name": "北大"
        }
      ]
    },
    {
      "name": "韓梅梅",
      "id": "002",
      "score": {
        "Chinese": 90,
        "Math": 80
      },
      "schoolInfo": [
        {
          "School_name": "清華"
        },
        {
          "School_name": "北大"
        }
      ]
    }
  ]
}

循環(huán)遍歷

std::string info = R"({"retCode":0,"retMSg":"成功","data":[{"name":"李雷","id":"001","score":{"Chinese":80,"Math":95},"schoolInfo":[{"School_name":"清華"},{"School_name":"北大"}]},{"name":"韓梅梅","id":"002","score":{"Chinese":90,"Math":80},"schoolInfo":[{"School_name":"清華"},{"School_name":"北大"}]}]})";
try {
    nlohmann::json doc = nlohmann::json::parse(info);
} catch (std::expection& e){
    // json轉(zhuǎn)化失敗會拋出異常,如json格式錯誤等
    std::cout << e.what() << std::endl;
}
// 循環(huán)遍歷
for (auto& item : doc.items()) {
    const std::string& key = item.key();
    auto& value = item.value(); // 用引用減少拷貝
    if (value.is_number()) {
        auto val = value.get<int>(); // 推導為int,如果是浮點型,轉(zhuǎn)化為int則只保留整數(shù)部分
        // int val = value;          // 強轉(zhuǎn)為int型
        // auto val = value.get<uint32_t>();
        // auto val = value.get<double>();
    } else if (value.is_string()) {
        const std::string& str = value;
        // std::string str = value;
    } else if (value.is_array()) { // value是一個數(shù)組
        int len = value.size();
        for (int i = 0; i < len; ++i) {
            if (value[i].is_object()) {
                ;
            } else if (value[i].is_string()) {
                ;
            }
        }
    } else if (value.is_object()) { // value是一個json
        for(auto& item_2 : value.items()) {
            ;                       // 類似處理
        }
    } else if (value.is_boolean()) {
        bool b = value; // 或者直接用value進行傳參,他會隱式轉(zhuǎn)換為bool型
    }
}

指定key遍歷

std::string info = R"({"retCode":0,"retMSg":"成功","data":[{"name":"李雷","id":"001","score":{"Chinese":80,"Math":95},"schoolInfo":[{"School_name":"清華"},{"School_name":"北大"}]},{"name":"韓梅梅","id":"002","score":{"Chinese":90,"Math":80},"schoolInfo":[{"School_name":"清華"},{"School_name":"北大"}]}]})";
nlohmann::json doc = nlohmann::json::parse(info);
if (doc.contains("retCode") && doc["retCode"].is_number()) {
    int retCode = doc["retCode"];
}
if (doc.contains("data") && doc["data"].is_array()) {
    nlohmann::json& doc_arr = doc["data"];
    int len = doc_arr.size();
} else if (doc.contains("data") && doc["data"].is_object()) {
    nlohmann::json& doc_json = doc["data"];
}

訪問key的幾種方式

// 1. 直接通過key訪問
std::string retMsg = doc["retMSg"];  // key不存在會出core(所以要判斷key是否存在),類型轉(zhuǎn)換失敗也會core
// 2. 通過at方法訪問
std::string retMsg = doc.at("retMSg"); // 同上,不同點在于at方法可以拋出異常(如果key不存在)
  • 兩種方式正常情況下返回的結(jié)果都是nlohmann::json對象,并且可以隱式轉(zhuǎn)化為string以及各種基本類型

  • 為了避免上述可能出現(xiàn)的問題,直接訪問key對應的value時,盡量按如下方式編寫程序:

    1. 先判斷key是否存在(contains)

    2. 再判斷key的類型,key類型相關的判斷方法如下:

    方法 含義
    is_number 是否為數(shù)字(int、uint32_t、uint64_t、double等)
    is_boolean 是否為bool
    is_string 是否為字符串
    is_array 是否為數(shù)組
    is_object 是否為json
  • 當然也可以通過捕獲異常的方式來達到避免程序出錯的目的,注意由于doc[“retMSg”]這種訪問方式不能拋出異常,應該使用doc.at(“retMSg”)這種方式來訪問。

3. json序列化

json序列化就是將json對象序列化成json格式的字符串或者存儲到文本文件

序列化為json字符串

string str = doc.dump();

保存為json文件文章來源地址http://www.zghlxwxcb.cn/news/detail-682785.html

nlohmann::json doc;

doc["app"] = "wechat";
doc["age"] = 17;

std::ofstream out_file("test.json");
out_file << doc;

到了這里,關于【C++】使用 nlohmann 解析 json 文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • C++ vs2015編譯json和protobuf報錯nlohmann::detail::static_constnlohmann::detail::to_json_fn::value‘

    C++ vs2015編譯json和protobuf報錯nlohmann::detail::static_constnlohmann::detail::to_json_fn::value‘

    補充:這個問題也會導致protobuf編譯和使用報錯,按照本方法修復后問題解決 只要引入項目中的 #include “nlohmann/json.hpp” 用vs2015編譯就會報錯,甚至用vs2022的Visual Studio 2015 (v140)工具集編譯也會報同樣的錯誤,錯誤信息如下: 參考這篇博客“JSON for Modern C++ vs2015 企業(yè)版和專業(yè)

    2024年02月05日
    瀏覽(41)
  • 使用nlohmann json庫進行序列化與反序列化

    nlohmann源碼倉庫:https://github.com/nlohmann/json 使用方式:將其nlohmann文件夾加入,包含其頭文件json.hpp即可 demo

    2024年02月10日
    瀏覽(21)
  • nlohmann json:類型檢查

    nlohmann提供了成員函數(shù)type(),用于返回當前的json數(shù)據(jù)類型: 可以根據(jù)type進行類型檢查:

    2024年02月13日
    瀏覽(22)
  • 【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)!

    【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)!

    ???♂? 作者:海碼007 ?? 專欄:UE虛幻引擎專欄 ?? 標題:【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)! ?? 寄語:人生的意義或許可以發(fā)揮自己全部的潛力,所以加油吧! ?? 最后: 文章作者技術和水平有限,如果文中出現(xiàn)錯誤,希望大

    2024年02月03日
    瀏覽(23)
  • nlohmann json:實現(xiàn)map和struct的互轉(zhuǎn)

    可以借助json實現(xiàn)map和struct的互轉(zhuǎn):

    2024年02月11日
    瀏覽(27)
  • nlohmann json:通過items遍歷object/array

    編譯運行輸出: key: one, value: 1 key: two, value: 2 key: 0, value: 1 key: 1, value: 2 key: 2, value: 4 key: 3, value: 8 key: 4, value: 16? 可以看到對于object可以通過key()和value()拿到鍵值對 對

    2024年02月13日
    瀏覽(22)
  • Unity解析json文件(分為json與jsonArray)

    什么是json? JSON是一種取代XML的數(shù)據(jù)結(jié)構(gòu),和xml相比,它更小巧但描述能力卻不差,由于它的小巧所以網(wǎng)絡傳輸數(shù)據(jù)將減少更多流量從而加快速度, 那么,JSON到底是什么? JSON就是一串字符串 只不過元素會使用特定的符號標注。 {} 雙括號表示對象 [] 中括號表示數(shù)組 “” 雙引號內(nèi)是

    2024年02月08日
    瀏覽(19)
  • Spark解析JSON文件,寫入hdfs

    一、用Sparkcontext讀入文件,map逐行用Gson解析,輸出轉(zhuǎn)成一個caseclass類,填充各字段,輸出。 解析JSON這里沒有什么問題。 RDD覆蓋寫的時候碰到了一些問題 : 1.直接saveAsTextFile沒有覆蓋true參數(shù); 2.轉(zhuǎn)dataframe時,還得一個一個字段顯化才能轉(zhuǎn)成dataframe; 3.write時,一開始打算寫

    2024年01月23日
    瀏覽(21)
  • 【python模塊】python解析json文件詳解

    【python模塊】python解析json文件詳解

    JSON(Java Script Object Notation)是一種通常用于以不會“對系統(tǒng)造成負擔”的方式傳輸數(shù)據(jù)(主要通過 API)的格式?;驹硎抢梦谋緛碛涗洈?shù)據(jù)點,并將數(shù)據(jù)點傳輸給第三方。 JSON是一種使用文本存儲數(shù)據(jù)對象的格式。換句話說,它是一種數(shù)據(jù)結(jié)構(gòu),將對象用 文本形式 表示出

    2024年02月08日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包