JSON序列化与反序列化-----使用JSON for Modern C++库

使用的三方库

JSON for Modern C++ 是一款优秀的在C++下使用的JSON库,我们使用这个三方库测试JSON的序列化和反序列化。

特点

  • 整个代码由一个头文件json.hpp组成,没有子项目,没有依赖,没有复杂的构建系统,使用起来非常方便。
  • STL和JSON容器之间可以相互转化。

项目地址

github.com/nlohmann/js...

使用

就像前面介绍的一样, 这个三方库只包含一个hpp文件,我们在项目中引入即可

下载github.com/nlohmann/js...

JSON的序列化

测试代码一

cpp 复制代码
#include <iostream>
#include <vector>
#include <map>
#include <string>

#include "json.hpp"

using namespace std;
using json = nlohmann::json;

// JSON序列化示例1
void func1() {
  json js;
  js["msg_type"] = 2;
  js["from"] = "zhangsan";
  js["to"] = "lisi";
  js["content"] = "hello lisi, I'm zhangsan";

  string str = js.dump(); // 获取字符串

  cout << str.c_str() << endl;  // string转char*输出,通过网络就可以发送了
}

int main() {

  func1();
  return 0;
}

运行输出结果

sh 复制代码
{"id":[1,2,3,4,5],"info":{"age":18,"gender":"male"},"name":"zhangsan"}

测试代码二

cpp 复制代码
#include <iostream>
#include <vector>
#include <map>
#include <string>

#include "json.hpp"

using namespace std;
using json = nlohmann::json;

void func2() {
  json js;
  // 添加数组
  js["id"] = {1, 2, 3, 4, 5};
  // 添加key-value
  js["name"] = "zhangsan";
  js["info"]["height"] = 175;
  js["info"]["weight"] = 65;
  // 添加map,一次性添加多个,相同键,后面的会覆盖前面的
  js["info"] = {{"age", 18}, {"gender", "male"}};

  string str = js.dump(); // 获取字符串

  cout << str.c_str() << endl;  // string转char*输出,通过网络就可以发送了
}

int main() {

  func2();
  return 0;
}

运行输出结果

sh 复制代码
{"id":[1,2,3,4,5],"info":{"age":18,"gender":"male"},"name":"zhangsan"}

测试代码三

cpp 复制代码
#include <iostream>
#include <vector>
#include <map>
#include <string>

#include "json.hpp"

using namespace std;
using json = nlohmann::json;


void func3() {
  json js;
  // 直接序列化一个vector容器
  vector<int> v = {1, 2, 3, 4, 5};
  js["id"] = v;

  // 直接序列化一个map容器
  map<string, int> m = {{"age", 18}, {"gender", 1}};
  js["info"] = m;

  string str = js.dump(); // 获取字符串

  cout << str.c_str() << endl;  // string转char*输出,通过网络就可以发送了
}

int main() {

  func3();
  return 0;
}

运行输出结果

sh 复制代码
{"id":[1,2,3,4,5],"info":{"age":18,"gender":1}}

JSON的反序列化

代码

cpp 复制代码
#include <iostream>
#include <vector>
#include <map>
#include <string>

#include "json.hpp"

using namespace std;
using json = nlohmann::json;

// JSON序列化示例1
string func1() {
  json js;
  js["msg_type"] = 2;
  js["from"] = "zhangsan";
  js["to"] = "lisi";
  js["content"] = "hello lisi, I'm zhangsan";

  string str = js.dump(); // 获取字符串

  return str;
}


int main() {

  string recvStr = func1();

  // 数据的反序列化
  json jsbuf = json::parse(recvStr);

  cout << jsbuf["msg_type"] << endl;
  cout << jsbuf["from"] << endl;
  cout << jsbuf["to"] << endl;
  cout << jsbuf["content"] << endl;

  return 0;
}

测试

sh 复制代码
➜  json_test ./main 
2
"zhangsan"
"lisi"
"hello lisi, I'm zhangsan"
相关推荐
hashiqimiya36 分钟前
springboot后端的接口headers
java·spring boot·后端
ss27343 分钟前
Springboot + vue 医院管理系统
vue.js·spring boot·后端
间彧1 小时前
InfluxDB详解与应用实战
后端
间彧1 小时前
对比InfluxDB与Prometheus在监控场景下的特点及选型建议
后端
间彧2 小时前
面向切面编程(AOP)中的“通知”和 专门用于增强 Spring MVC 中控制器(Controller)的“通知”
后端
逻极2 小时前
Rust数据类型(下):复合类型详解
开发语言·后端·rust
星释2 小时前
Rust 练习册 12:所有权系统
开发语言·后端·rust
间彧2 小时前
AOP中的五种通知类型在实际项目中如何选择?举例说明各自的典型应用场景
后端
间彧2 小时前
Spring Boot中很多Advice后缀的注解和类,都是干什么的
后端