1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        聯(lián)合創(chuàng)作 · 2023-09-21 20:11

        介紹

        該庫為輕量級(jí)的c++ json解析與構(gòu)造庫,源碼很短,適合學(xué)習(xí),覺得不錯(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,庫中提供了方便操作的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初始化宏的目的是為了替代{}來進(jìn)行初始化,因?yàn)橛袝r(shí)候大括號(hào)看起來會(huì)不夠直觀。

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

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

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

        • 使用了很多遞歸方法

        編譯

        編譯依賴:

        • cmake
        • gcc

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

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

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

        提供方便的API

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

        1. JSON Array

          • 使用 [] 操作符寫入數(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<float>(2); ,如果類型不正確的話會(huì)拋出異常

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

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

        2. JSON Object

          • 使用 [] 來寫入數(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ù)雜的初始化方法

            這種方法看起來比較直觀,支持object和array的嵌套使用,這是我自己想出來的,有興趣的朋友可以看下我的實(shí)現(xiàn)方法,討論下有沒有更加優(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è)宏,使得編寫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") 可以獲取到鍵為string的值。

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

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

            1551941891253

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

            1551942038488

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

            1551942154905

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

          由于我們不知道字符串是array還是object,我們使用JSONBase類來接受返回的結(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<JSONObject *>(a); //類型轉(zhuǎn)換
          cout << b->get<string>("key1") << endl;
          cout << b->get<JSONArray>("key2").get<int>(1) << endl;

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

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

        瀏覽 28
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        編輯 分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            色狗av影院 | 国产精品嫩穴 | 噜噜色噜噜网 | 亚洲精品国产成人综合久久久久久久久 | jizzjizzjizzjizz国产 | 日本在线国产 | A级视频 中文字幕第二页在线观看 在线欧美成人电影 | 岳乳丰满一区二区三区 | 操老女人小说 | 女人口述交换啪啪高潮过程 |