赞
踩
最初接触到Json,还是在Python的爬虫里面。
Json是一种轻量级的数据交换格式,具有数据格式简单,读写方便易懂等很多优点。用它来进行前后端的数据传输,大大的简化了服务器和客户端的开发工作量。
如果说现在对json还没有什么概念的朋友,了解了以上内容之后,再了解一下它是字典形式的即可。一切存取操作如字典。
只是前后可能做点格式转换罢了。
来个例子熟悉一下:
{
"animals": {
"dog": [
{
"name": "Rufus",
"age":15
},
{
"name": "Marty",
"age": null
}
]
}
}
我们平时要去哪里找这种json格式的数据呢?网络抓包抓出来的就有很多是这样的,前面不是说了嘛。
Python有自带的json模块,用的比较多的函数有如下:
json.dumps() 是将 python 对象转化为 json。
json.loads() 是将 json 转化为 python 对象。
如果你是用谷歌浏览器来看网页源码的话,你看到的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++的服务器如何跟其他语言的客户端通信?
就理解为外库,
链接: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 一时半会儿还编译不了,就只能在下边儿用终端去编译了,哎。
点一下 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_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的,看来有点难了。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。