91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

電子發(fā)燒友App

硬聲App

掃碼添加小助手

加入工程師交流群

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>ejson輕量簡(jiǎn)單的C++ JSON解析庫(kù)

ejson輕量簡(jiǎn)單的C++ JSON解析庫(kù)

2022-06-22 | zip | 0.41 MB | 次下載 | 免費(fèi)

資料介紹

授權(quán)協(xié)議 未知
開(kāi)發(fā)語(yǔ)言 C/C++
操作系統(tǒng) 跨平臺(tái)
軟件類型 開(kāi)源軟件

軟件簡(jiǎn)介

介紹

該庫(kù)為輕量級(jí)的c++ json解析與構(gòu)造庫(kù),源碼很短,適合學(xué)習(xí),覺(jué)得不錯(cuò)的點(diǎn)個(gè)star。

提供了的功能:

  • json字符串解析為c++對(duì)象(JSONArray和JSONObject)
  • c++對(duì)象中獲取key-value值
  • c++對(duì)象轉(zhuǎn)化為json字符串

除此之外,由于json支持了多種數(shù)據(jù)類型,還可以將JSONArray對(duì)象看成是python的list,JSONObject看成是python的dict,庫(kù)中提供了方便操作的api函數(shù)。例如以下初始化方法,

JSONArray arr = {123.4, "dfsdf", 23, nullptr}; // 類似于python的list
JSONArray arr2 = LIST(1.23, "sdfsdg", 234, nullptr); //提供一個(gè)LIST初始化宏,類似于python的list
JSONObject obj = {
    {"test obj", {"key", "value"}},
    {"int number", 2},
    {"float number", 34.3},
    {"my string", "fsdfsdg"},
    {"nullptr", nullptr},
    {"emptylist", {}},
}; // 可以看成是python的dict
JSONObject obj2 = OBJECT(
            KEYVALUE("username", "hhk"),
            KEYVALUE("obj", OBJECT(
                    KEYVALUE("abcd", LIST(1,2.3, "hahahaha")),
                    KEYVALUE("obj", OBJECT(
                            KEYVALUE("key", "this is obj.obj.key' s value")
                    ))
            )),
            KEYVALUE("null", nullptr),
            KEYVALUE("list", LIST(1, "qwerty", 2.34, OBJECT(
                            KEYVALUE("key", "this is a key"),
                            KEYVALUE("key2", "this is a key2"),
                    ))),
    		);  // 提供了一個(gè)初始化宏,類似于python的dict
// 注:使用OBJECT LIST初始化宏的目的是為了替代{}來(lái)進(jìn)行初始化,因?yàn)橛袝r(shí)候大括號(hào)看起來(lái)會(huì)不夠直觀。

實(shí)現(xiàn)該庫(kù)的一些技巧:

  • 參考boost any.hpp ,實(shí)現(xiàn)一個(gè)可以在容器里容納任意類型的對(duì)象

  • typeid 進(jìn)行類型的判斷

  • 使用了很多遞歸方法

編譯

編譯依賴:

  • cmake
  • gcc

如果是windows平臺(tái)推薦使用cygwin套件(可以在windows下編譯linux軟件),配合clion,開(kāi)發(fā)起來(lái)挺方便的。

例如windows平臺(tái)下(linux下類似),編譯靜態(tài)庫(kù)的方法如下,編譯成功后在build目錄下生成libSimpleJson.a靜態(tài)庫(kù)。

pYYBAGKn6GCABxDzAAOr0oQWhoM905.jpg

編譯測(cè)試程序方法如下:(-lSimpleJson參數(shù)表示鏈接libSimpleJson.a靜態(tài)庫(kù))

poYBAGKn6GGAVYR2AAIsdjLJ02U974.jpg

提供方便的API

這里Json支持的類型有int, float, double, const char* , string, nullptr(cpp中的空指針)

  1. JSON Array

    • 使用 [] 操作符寫(xiě)入數(shù)據(jù),可以使用cout直接打印輸出

      JSONArray test1(2); // 初始化分配大小,可以會(huì)自動(dòng)拓展容量
      test1[0] = nullptr;
      test1[1] = "this is const char*";
      test1[2] = 12324.5;
      test1[5] = "中文字符串";
      cout << test1 << endl;
    • 初始化列表構(gòu)造函數(shù)與鏈?zhǔn)讲僮?/p>

      JSONArray arr = {123.4, "dfsdf", 23, nullptr}; // 初始化列表 
      arr[0] = 12.314;
      arr[2] = 2335;
      arr[3] = "字符串";
      arr[6] = obj;  // json對(duì)象
      arr.add(123456) // 整數(shù)
         .add(234.235236) //浮點(diǎn)數(shù)
         .add("字符串") //字符串
         .add(nullptr); // null測(cè)試
    • get方法獲取數(shù)值

      例如?float f = test1.get(2);?,如果類型不正確的話會(huì)拋出異常

    • toString方法轉(zhuǎn)換為字符串,toString可選參數(shù),代表縮進(jìn)的數(shù)量。

      例如?test1.toString(4)?表示4空格縮進(jìn)

  2. JSON Object

    • 使用 [] 來(lái)寫(xiě)入數(shù)據(jù)

      // 使用[] 操作對(duì)象
      JSONObject test2;
      test2["float"] = 123.456;
      test2["int"] = 24;
      test2["string"] = "this is a string";
      test2["array"] = test1;
      test2["nullptr"] = nullptr;
      cout << test2 << endl;
    • 更加復(fù)雜的初始化方法

      這種方法看起來(lái)比較直觀,支持object和array的嵌套使用,這是我自己想出來(lái)的,有興趣的朋友可以看下我的實(shí)現(xiàn)方法,討論下有沒(méi)有更加優(yōu)秀的實(shí)現(xiàn)方式。

      // obj初始化方法
      JSONObject obj = {
          {"test obj", {"key", "value"}},
          {"int number", 2},
          {"float number", 34.3},
          {"my string", "fsdfsdg"},
          {"nullptr", nullptr},
          {"emptylist", {}},
          {"列表嵌套列表", {1,2.3, "sdf", {1,2.242, "float"}}}, // 列表嵌套
          {"列表嵌套對(duì)象和列表", {
              {{"key1", 1234}}, // 被認(rèn)為是對(duì)象
              {"key1", 1234}, // 被認(rèn)為是列表
              1.23,
              234325
          }},
          {"對(duì)象", { // 所有的值都是{key, value}對(duì)則認(rèn)為是嵌套對(duì)象
              {"a obj", 1234566},
              {"b obj", "b obj value"},
          }}
      };

      這種方法有時(shí)候還是有點(diǎn)不夠直觀,所以我弄了一個(gè)宏,使得編寫(xiě)json時(shí)更加直觀

      JSONObject context = OBJECT(
                  KEYVALUE("username", "hhk"),
                  KEYVALUE("obj", OBJECT(
                          KEYVALUE("abcd", LIST(1,2.3, "hahahaha")),
                          KEYVALUE("obj", OBJECT(
                                  KEYVALUE("key", "this is obj.obj.key' s value")
                          ))
                  )),
                  KEYVALUE("null", nullptr),
                  KEYVALUE("list", LIST(1, "qwerty", 2.34, OBJECT(
                                  KEYVALUE("key", "this is a key"),
                                  KEYVALUE("key2", "this is a key2"),
                          ))),
                  KEYVALUE("list1", LIST(1,2,3,4,5)),
                  KEYVALUE("list2", LIST(1,2,3)),
                  KEYVALUE("obj2", OBJECT(
                          KEYVALUE("key1", "value1"),
                          KEYVALUE("key2", 222),
                          KEYVALUE("key3", 333),
                  )),
                  KEYVALUE("a", "111"),
                  KEYVALUE("b", "222"),
                  KEYVALUE("c", "333"),
          );

      這里有三個(gè)宏,分別是OBJECT,KEYVALUE, LIST。

    • 支持鏈?zhǔn)絘dd的操作

      obj["int"] = 12325;
      obj["float"] = 24235.235235;
      obj["string"] = "this is a string2";
      obj["null"] = nullptr;
      
      obj.add("int", 123) // 整數(shù)
          .add("float", 23.2324) // 浮點(diǎn)數(shù)
          .add("string", "this is a string") // 英文字符串
          .add("中文", "這是中文字符串。。。") // 中文字符串
          .add("symbols  ",.[]@!#$%^", "含有特殊符號(hào)"") // 特殊符號(hào)
          .add("list", {1, 2.34, "english string", 123.4, "中文字符串"}) // 列表
          .add("this is null", nullptr) // null測(cè)試
          .add("object", {{"key1", "value1"}, {"key2", 223}, {"key3", 23.4}}); // 對(duì)象
    • get 方法獲取數(shù)值

      例如,?obj->get("string")?可以獲取到鍵為string的值。

    • toString方法輸出字符串,參數(shù)為縮進(jìn)的數(shù)量

      例如4空格縮進(jìn)如下(obj.toString(4))

      pYYBAGKn6GKATA1oAAAYQQc8rho437.png

      無(wú)縮進(jìn)(obj.toString(-1)

      pYYBAGKn6GOAXhMhAAARi5J0ViM948.png

      無(wú)空格縮進(jìn)(?obj.toString(0))

      pYYBAGKn6GWATqiXAAAVrsEw-s4193.png

  3. 字符串轉(zhuǎn)換為json對(duì)象

    由于我們不知道字符串是array還是object,我們使用JSONBase類來(lái)接受返回的結(jié)果。

    (JSONBase中有isJSONArray 和 isJSONArray 方法,可以方便我們進(jìn)行類型判斷)

    例如以下,

    string parse_str = R"({"name" : "hhk" , "key1": "valu"e1 ","key2":[1,2,"asd",{"sadf": 123, "sb": 12.3}, 123.3]})";
    JSONBase* a = JSONBase::parse(parse_str);
    cout << *a << endl;
    JSONObject *b = dynamic_cast(a); //類型轉(zhuǎn)換
    cout << b->get("key1") << endl;
    cout << b->get("key2").get(1) << endl;

    parse方法用于不知道字符串是array還是object,parse_obj方法返回JSONObject,parse_arr方法返回JSONArray。(parse_obj,parse_arr用于明確知道字符串的類型)

    如果字符串不是json字符串,則拋出JSONParseException異常。

?

C++ JSON
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評(píng)論

查看更多

下載排行

本周

  1. 1新一代網(wǎng)絡(luò)可視化(NPB 2.0)
  2. 3.40 MB  |  1次下載  |  免費(fèi)
  3. 2冷柜-電氣控制系統(tǒng)講解
  4. 13.68 MB   |  1次下載  |  10 積分
  5. 3MDD品牌三極管MMBT3906數(shù)據(jù)手冊(cè)
  6. 2.33 MB  |  次下載  |  免費(fèi)
  7. 4MDD品牌三極管S9012數(shù)據(jù)手冊(cè)
  8. 2.62 MB  |  次下載  |  免費(fèi)
  9. 5LAT1218 如何選擇和設(shè)置外部晶體適配 BlueNRG-X
  10. 0.60 MB   |  次下載  |  3 積分
  11. 6LAT1216 Blue NRG-1/2 系列芯片 Flash 操作與 BLE 事件的互斥處理
  12. 0.89 MB   |  次下載  |  3 積分
  13. 7收音環(huán)繞擴(kuò)音機(jī) AVR-1507手冊(cè)
  14. 2.50 MB   |  次下載  |  免費(fèi)
  15. 8MS1000TA 超聲波測(cè)量模擬前端芯片技術(shù)手冊(cè)
  16. 0.60 MB   |  次下載  |  免費(fèi)

本月

  1. 1愛(ài)華AIWA HS-J202維修手冊(cè)
  2. 3.34 MB   |  37次下載  |  免費(fèi)
  3. 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊(cè)
  4. 1.63 MB   |  23次下載  |  免費(fèi)
  5. 3NB-IoT芯片廠商的資料說(shuō)明
  6. 0.31 MB   |  22次下載  |  1 積分
  7. 4UWB653Pro USB口測(cè)距通信定位模塊規(guī)格書(shū)
  8. 838.47 KB  |  5次下載  |  免費(fèi)
  9. 5蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
  10. 0.04 MB   |  4次下載  |  1 積分
  11. 6蘇泊爾DCL6909(即CHK-S009)單芯片電磁爐原理圖資料
  12. 0.08 MB   |  2次下載  |  1 積分
  13. 7100W準(zhǔn)諧振反激式恒流電源電路圖資料
  14. 0.09 MB   |  2次下載  |  1 積分
  15. 8FS8025B USB的PD和OC快充協(xié)議電壓誘騙控制器IC技術(shù)手冊(cè)
  16. 1.81 MB   |  1次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935137次下載  |  10 積分
  3. 2開(kāi)源硬件-PMP21529.1-4 開(kāi)關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計(jì)
  4. 1.48MB  |  420064次下載  |  10 積分
  5. 3Altium DXP2002下載入口
  6. 未知  |  233089次下載  |  10 積分
  7. 4電路仿真軟件multisim 10.0免費(fèi)下載
  8. 340992  |  191439次下載  |  10 積分
  9. 5十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
  10. 158M  |  183353次下載  |  10 積分
  11. 6labview8.5下載
  12. 未知  |  81602次下載  |  10 積分
  13. 7Keil工具M(jìn)DK-Arm免費(fèi)下載
  14. 0.02 MB  |  73822次下載  |  10 積分
  15. 8LabVIEW 8.6下載
  16. 未知  |  65991次下載  |  10 積分