天天看點

C++搭建叢集聊天室(五):JSON序列化與反序列化

C++搭建叢集聊天室(五):JSON序列化與反序列化

文章目錄

    • 玩轉json
      • 什麼是json
      • Python中的Json子產品
        • 擷取json中的某個資料
      • json.hpp 檔案擷取
      • 序列化實操
      • 反序列化代碼實操
      • CMake編譯

最初接觸到Json,還是在Python的爬蟲裡面。

玩轉json

什麼是json

Json是一種輕量級的資料交換格式,具有資料格式簡單,讀寫友善易懂等很多優點。用它來進行前後端的資料傳輸,大大的簡化了伺服器和用戶端的開發工作量。

如果說現在對json還沒有什麼概念的朋友,了解了以上内容之後,再了解一下它是字典形式的即可。一切存取操作如字典。

隻是前後可能做點格式轉換罷了。

來個例子熟悉一下:

{
    "animals": {
        "dog": [
            {
                "name": "Rufus",
                "age":15
            },
            {
                "name": "Marty",
                "age": null
            }
        ]
    }
}           

複制

我們平時要去哪裡找這種json格式的資料呢?網絡抓包抓出來的就有很多是這樣的,前面不是說了嘛。

Python中的Json子產品

Python有自帶的json子產品,用的比較多的函數有如下:

json.dumps() 是将 python 對象轉化為 json。

json.loads() 是将 json 轉化為 python 對象。           

複制

如果你是用谷歌浏覽器來看網頁源碼的話,你看到的json包那是相當之淩亂的啊,這時候我建議你先暫時切換到火狐來,就會看到如下格式的圖:

C++搭建叢集聊天室(五):JSON序列化與反序列化

是不是會清晰很多、

擷取json中的某個資料

如果我們要擷取上面示例資料(test)中的某個元素,比方說,狗的名字,要如何操作呢?

dog_msg = json.loads(test)
for msg in dog_msg["animals"]["dog"] 
	print(msg["name"])           

複制

注意,在json資料裡面,{} 是字典,[] 是清單。

那麼今天講這些嗎?顯然不的。今天我們使用的是C++。

那麼C++也可以操作Json嗎?那不是廢話嗎。

Json、PB、XML等結構化語言是獨立于C++、Java、Python等語言而存在的中間交流語言,不然你讓C++的伺服器如何跟其他語言的用戶端通信?

json.hpp 檔案擷取

就了解為外庫,

連結:https://pan.baidu.com/s/17LH01UikiuXX77Q47zkOog

提取碼:cpk8

具體使用的時候怎麼去用呢,直接拖到工程目錄底下就好了。

序列化實操

不動點真格兒的你當我跟你開玩笑呢?

遇到bug請到這個專欄尋找看看有沒有:

問題解決專欄

#include"json.hpp"
using json = nlohmann::json; 


#include<vector>
#include<map>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;

void func1(){
    // 先來個最基本的
    json js;

    js["name"] = "wlf";
    js["age"] = "21";
    
    string s = js.dump();   //和Python裡面的一樣

    cout<<"func1:"<<s.c_str()<<endl;
}

void func2(){
    //将vector序列化,以示範JSON可序列化容器
    json js;
    vector<int> vc = {1,2,3,4,5,6,7,8,9};

    js["vc"] = vc;

    string s = js.dump();

    cout<<"func2:"<<s.c_str()<<endl;    
}

void func3(){
    //将map序列化
    json js;
    map<string,string> mss;
    // mss["name"] = "wlf"; 
    // mss["age"] = "21";

    mss.insert({"name","wlf"});   //呦呵,pair也插不了
    mss.insert({"age","21"});     //不過這樣倒是比用pair要友善

    js["path"] = mss;
    string s = js.dump();

    cout<<"func3:"<<s.c_str()<<endl; 
}


int main(){

    func1();
    func2();
    func3();

    return 0;
}           

複制

我的 VScode 一時半會兒還編譯不了,就隻能在下邊兒用終端去編譯了,哎。

C++搭建叢集聊天室(五):JSON序列化與反序列化

點一下 show errors,就跟你說:No problem,你說氣人不。。。

反序列化代碼實操

放碼過來:

#include"json.hpp"
using json = nlohmann::json; 


#include<vector>
#include<map>
#include<string>
#include<string.h>
#include<iostream>
using namespace std;

void func(){
    // 先來個最基本的
    json js;

    map<string,string> mss;
    mss.insert({"name","wlf"});   //呦呵,pair也插不了
    mss.insert({"age","21"});     //不過這樣倒是比用pair要友善

    vector<int> vc = {1,2,3,4,5,6,7,8,9};

    js["name"] = "wlf";
    js["age"] = "21";
    js["path"] = mss;
    js["vc"] = vc;

    string s = js.dump();   //和Python裡面的一樣

    json js2 = json::parse(s);  //先解析,這裡和Python不太一樣
    //傳回一個JSON的對象,可以看做一個容器
    cout<<js2<<endl;

    // 直接取key-value 
    string name = js2["name"]; 
    cout << "name:" << name << endl;

    // 直接反序列化vector容器 
    vector<int> v = js2["vc"]; 
    for(int val : v) { 
        cout << val << " "; 
    }
    cout << endl;

    // 直接反序列化map容器 
    map<string, string> 
    m2 = js2["path"]; 
    for(auto p : m2) { 
        cout << p.first << " " << p.second << endl; 
    }
    cout << endl;
}


int main(){

    func();

    return 0;
}           

複制

CMake編譯

昨天晚上那篇cmake畢竟寫的比較簡陋,為什麼嘞,因為接下來每篇都要實操cmake。

cmake_minimum_required(VERSION 3.0) # 最低版本
project(main)   # 給這個工程一個名字,這不是可執行檔案的名字,是工程的名字

set(SRC_LIST json_test.cpp)  # 可放多個,但是沒必要

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

add_executable(json_test ${SRC_LIST})           

複制

問:[cmake]有沒清理所有編譯生成檔案的clean指令

答:答案是沒有。

推薦等價于clean的方法:

在你的source目錄之外建一個build目錄,在這個build目錄下進行cmake,如果想清理,删掉build下所有檔案即可:

mkdir build

cd build

cmake ..

make           

複制

天呐,一早上就寫了一個這個,本來還想再寫個muduo的,看來有點難了。。。

本文參與 騰訊雲自媒體分享計劃 ,歡迎熱愛寫作的你一起參與!

本文分享自作者個人站點/部落格

https://blog.csdn.net/qq_43762191

複制

如有侵權,請聯系 [email protected] 删除。