当前位置:   article > 正文

C++搭建集群聊天室(五):JSON序列化与反序列化_c++序列号反序列化json

c++序列号反序列化json

请添加图片描述

最初接触到Json,还是在Python的爬虫里面。

玩转json

什么是json

Json是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点。用它来进行前后端的数据传输,大大的简化了服务器和客户端的开发工作量。

如果说现在对json还没有什么概念的朋友,了解了以上内容之后,再了解一下它是字典形式的即可。一切存取操作如字典。
只是前后可能做点格式转换罢了。

来个例子熟悉一下:

{
    "animals": {
        "dog": [
            {
                "name": "Rufus",
                "age":15
            },
            {
                "name": "Marty",
                "age": null
            }
        ]
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

我们平时要去哪里找这种json格式的数据呢?网络抓包抓出来的就有很多是这样的,前面不是说了嘛。


Python中的Json模块

Python有自带的json模块,用的比较多的函数有如下:

json.dumps() 是将 python 对象转化为 json。

json.loads() 是将 json 转化为 python 对象。
  • 1
  • 2
  • 3

如果你是用谷歌浏览器来看网页源码的话,你看到的json包那是相当之凌乱的啊,这时候我建议你先暂时切换到火狐来,就会看到如下格式的图:
在这里插入图片描述

是不是会清晰很多、

获取json中的某个数据

如果我们要获取上面示例数据(test)中的某个元素,比方说,狗的名字,要如何操作呢?

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

注意,在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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60

我的 VScode 一时半会儿还编译不了,就只能在下边儿用终端去编译了,哎。

在这里插入图片描述

点一下 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

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})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

问:[cmake]有没清理所有编译生成文件的clean命令

答:答案是没有。

推荐等价于clean的方法:

在你的source目录之外建一个build目录,在这个build目录下进行cmake,如果想清理,删掉build下所有文件即可:

mkdir build

cd build

cmake ..

make
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

天呐,一早上就写了一个这个,本来还想再写个muduo的,看来有点难了。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/689013
推荐阅读
相关标签
  

闽ICP备14008679号