JSON封裝數據和解析數據

JSON簡介
JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它基於JavaScript的一個子集,易於人的編寫和閱讀,也易於機器解析。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成爲理想的數據交換語言。

JSON由兩種結構組成:

1.鍵值對的無序集合——對象(或者叫記錄、結構、字典、哈希表、有鍵列表或關聯數組等)

2.值的有序列表——數組

這些都是常見的數據結構。事實上大部分現代計算機語言都以某種形式支持它們。這使得一種數據格式在同樣基於這些結構的編程語言之間交換成爲可能。

JSON中的形式:

對象是一個無序鍵值對的集合,以"{“開始,同時以”}“結束,鍵值對之間以”:“相隔,不同的鍵值對之間以”,"相隔,舉例

{
    "key1" : 1,
    "key2" : "string"
}

JSON優缺點
總結:

1.佔帶寬小(格式是壓縮的)

  1. js通過eval()進行Json讀取(便於客戶端讀取)

  2. JSON支持多種語言(c、c++、PHP等),便於服務端解析

JSON (JavaScript Object Notation) 的輕量級數據交換格式能夠替代XML的工作.

優點:

  1. 數據格式比較簡單, 易於讀寫, 格式都是壓縮的, 佔用帶寬小

  2. 易於解析這種語言, 客戶端javascript可以簡單的通過eval()進行JSON數據的讀取

  3. 支持多種語言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, php, Python, Ruby等語言服務器端語言, 便於服務器端的解析

  4. 在PHP世界, 已經有PHP-JSON和JSON-PHP出現了, 便於PHP序列化後的程序直接調用. PHP服務器端的對象、數組等能夠直接生JSON格式, 便於客戶端的訪問提取. 另外PHP的PEAR類已經提出了支持 (http://pear.php.net/pepr/pepr-proposal-show.php?id=198)

  5. 因爲JSON格式能夠直接爲服務器端代碼使用, 大大簡化了服務器端和客戶端的代碼開發量, 但是完成的任務不變, 且易於維護

缺點:

  1. 沒有XML格式這麼推廣的深入人心和使用廣泛, 沒有XML那麼通用性2. JSON格式目前在Web Service中推廣還屬於初級階段PS: 據說Google的Ajax是使用 JSON+模板 做的

JSON實際使用情況:
在實際調用接口中,傳輸數據經常會用到json,例如請求騰訊雲短信發送接口,請求參數數據格式就是json,如下圖:
在這裏插入圖片描述
在實際使用中怎麼判斷json格式是否正確呢?百度JSON在線工具,直接校驗,如下圖:
在這裏插入圖片描述
老鐵,這個json格式,沒毛病,提示是不是很直接。。。。。。。哈哈。

C++ 使用Json封裝數據和解析數據
使用C++和別的語言做交互比較常用的一種數據操作方式就是json。可以到GitHub上下載對應C++的json庫源碼,我自己下了一套之前的版本,可以正常使用。jsoncpp-src

編譯出來的庫名:json_vc71_libmtd.lib(debug) | json_vc71_libmt.lib(release)

需要包含的頭文件:jsoncpp-src(對應源碼)/include/json (該目錄下所有文件)

調用庫方式

#include "json/json.h"
#ifdef _DEBUG
#pragma comment(lib,"./lib/json_vc71_libmtd.lib")
#else
#pragma comment(lib,"./lib/json_vc71_libmt.lib")
#endif

封裝json數據爲string
方法1:

std::string DataToJson()
{
    Json::FastWriter writerinfo;
    Json::Value  writevalueinfo;
    writevalueinfo["id"]=abc123;   
    writevalueinfo["time"]="2020.04.26 00:00:00";

    Json::Value  writedata;
    writedata["count"] = 1;
    writedata["name"] = "cpp";

    writevalueinfo["data"]=writedata;

    std::string strEmail = writerinfo.write(writevalueinfo);
    return strEmail;
}
示例json://公衆號:C與C語言plus
{
    "data": {
        "count": 1,
        "name": "cpp"
    },
    "id": abc123,
    "time": "2020.04.26 00:00:00"
}

方法2(直接拼接):

CString strTempData;
msg_content =1號設備水位超過閾值報警”;
cstrsha256 =20823c7cf53e97898f39f212b9dbee960220b3fa272c884c62f1f3fe6af56f38”;
strmobile =13004091102;
strtime =1587711951;
strTempData.Format("{\"tpl_id\": %ld,\"params\":\[ \"%s\"\],\"playtimes\": %d,\"sig\": \"%s\",
\"tel\":\{\"mobile\":\"%s\",\"nationcode\":\"%d\"\},\"time\": %ld, \"ext\":\"\"\}",568369,
msg_content,2,cstrsha256,strmobile,86,strtime);

示例json:  //公衆號:C與C語言plus
{
  "tpl_id": 568369,
  "params": ["1號設備水位超過閾值報警 "],
  "playtimes": 2,
  "sig": "20823c7cf53e97898f39f212b9dbee960220b3fa272c884c62f1f3fe6af56f38",
  "tel": {
    "mobile": "13004091102",
    "nationcode": "86"
  },
  "time": 1587711951,
  "ext": ""
}

解析json數據

void TranslateJson(const string strData)
{
    // 解析json用Json::Reader
    Json::Reader *readerinfo = new Json::Reader(Json::Features::strictMode());
    // Json::Value是一種很重要的類型,可以代表任意類型。如int, string, object, array...
    Json::Value root;       
    if (readerinfo->parse(strData, root))
    {
        if (root["id"].isInt())
        {
            int nID = root["id"].asInt();
        }
        if (root["time"].isString())
        {
            std::string strTime = root["time"].asString();
        }
        if (root["data"]["count"].isInt())
        {
            int nDataCount = root["data"]["count"].asInt();
        }

        if (root["data"]["name"].isString())
        {
            std::string strDataName = root["data"]["name"].asString();
        }

    }
    ::delete readerinfo;
    readerinfo = NULL;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章