当前位置: 首页 > article >正文

Json学习与实践

1 Json

json是一种轻量化的数据交换格式/数据序列化格式。独立于编程语言。其简洁和清晰的层次化结构可以在客户端和服务器之间高效的通信。(mssage-------数据序列化----json-----数据反序列化------message)

其次还有xml、protobuf。

1.1 Json数据序列化

json可以看作STL容器一样使用。

json数据只有序列化为字符串流才可以在网络中传输。

方法:json.dump()

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

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

void test01(){
    //创建json对象
    json js;
    //json使用类似于unordered_map,键值对、无序
    //值类型可以是字符串、数组、也可以是json字符串(同一个键不同键值)
    js["id"]={1,2,3,4};
    js["msg"]["text1"]="aaa";
    js["msg"]["text1"]="bbb";
    js["abd"]={{"1","yyy"},{2,"zzz"}};
    js["msg_type"]=2;
    js["from"]="zhang san";
    js["to"]="li si";
    js["ask"]="hello";
    cout<<js<<endl;
    /*{"ask":"hello","from":"zhang san","msg_type":2,"to":"li si"}*/
    //在网络中需要数据序列化转化为字节流或者字符流
    string sendbuf=js.dump();
    //转换为c风格的字符串char*
    cout<<sendbuf.c_str()<<endl;
    /*{"ask":"hello","from":"zhang san","msg_type":2,"to":"li si"}*/
}
int main(){
    test01();
    return 0;
}
//json容器序列化
void test02(){
    json js;
    vector<int>v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    js["list"]=v;
    map<int,string>m;
    m.insert({1,"aaa"});
    m.insert({2,"bbb"});
    m.insert(make_pair(3,"ccc"));
    js["map"]=m;
    cout<<js<<endl;
    /*{"list":[1,2,3],"map":[[1,"aaa"],[2,"bbb"],[3,"ccc"]]}*/
}

1.2 Json数据反序列化

网络字符串流转化为json,得到json对象,访问值采用键值对方式,对值的类型可以直接用对应的数据类型或者容器进行接收,便于访问。

auto arr=jsbuf["id"];

vector<int> v=jsbuf["list"];

方法:json js = json::parse(str)

//json数据反序列化
string test03(){
    //创建json对象
    json js;
    js["msg_type"]=2;
    js["from"]="zhang san";
    js["to"]="li si";
    js["ask"]="hello";
    cout<<js<<endl;
    /*{"ask":"hello","from":"zhang san","msg_type":2,"to":"li si"}*/
    //在网络中需要数据序列化转化为字节流或者字符流
    string sendbuf=js.dump();
    return sendbuf;
}
int main(){
    //test01();
    //test02();
    string recvBuf=test03();
    //进行反序列化,由字符串转化为数据对象,看作容器方便访问
    json jsBuf=json::parse(recvBuf);
    cout<<jsBuf["msg_type"]<<endl;
    cout<<jsBuf["from"]<<endl;
    cout<<jsBuf["to"]<<endl;
    cout<<jsBuf["ask"]<<endl;
    /*2
    "zhang san"
    "li si"
    "hello"
    */
    return 0;
}

http://www.kler.cn/a/511300.html

相关文章:

  • 华为HuaweiCloudStack(一)介绍与架构
  • [LeetCode] 哈希表 I — 242#有效的字母异位词 | 349#两个数组的交集 | 202#快乐数 | 1#两数之和
  • 【专题二 二叉树中的深搜】98. 验证二叉搜索树
  • 基于Python的心电图报告解析与心电吸引子绘制
  • javaEE初阶————多线程初阶(2)
  • AI-Talk开发板之替换唤醒词
  • 开发模式(webpack-dev-server)
  • C语言之字符函数和字符串函数(下)
  • 如何使用 Pytest 断言测试 Python 异常处理
  • 计算机网络 (51)鉴别
  • Mysql 主从复制原理及其工作过程,配置一主两从实验
  • LeetCode热题100(子串篇)
  • CesiumLab和CIMRTS的尝试融合
  • 学技术学英语:TCP的三次握手和四次挥手
  • 基于PSO粒子群优化TCN时间卷积神经网络时间序列预测算法matlab仿真
  • 代码随想录26
  • OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用
  • 51c自动驾驶~合集48
  • 设计模式:责任链模式——行为型模式
  • 【从零开始入门unity游戏开发之——C#篇46】C#补充知识点——命名参数和可选参数
  • Markdown学习笔记(2)
  • C# 控制打印机:从入门到实践
  • 胶质母细胞瘤浸润的个性化预测:数学模型、物理信息神经网络和多模态扫描|文献速递-视觉大模型医疗图像应用
  • 机器学习——什么是代价函数?
  • BUUCTF_Web(October 2019 Twice SQL injection)
  • 【物联网】ARM核介绍