JSON简介

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于JavaScript的一个子集,易于人的编写和阅读,也易于机器解析。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。

JSON由两种结构组成:

1.键值对的无序集合——对象(或者叫记录、结构、字典、哈希表、有键列表或关联数组等)

2.值的有序列表——数组

这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

JSON中的形式:

对象是一个无序键值对的集合,以"{"开始,同时以"}"结束,键值对之间以":"相隔,不同的键值对之间以","相隔,举例

  •  
  •  
  •  
  •  
{    "key1" : 1,    "key2" : "string"}
JSON优缺点

总结:

1.占带宽小(格式是压缩的)

2. js通过eval()进行Json读取(便于客户端读取)

3. JSON支持多种语言(c、c++、PHP等),便于服务端解析

JSON (JavaScript Object Notation) 的轻量级数据交换格式能够替代XML的工作.

优点:

1. 数据格式比较简单, 易于读写, 格式都是压缩的, 占用带宽小

2. 易于解析这种语言, 客户端javascript可以简单的通过eval()进行JSON数据的读取 

3. 支持多种语言, 包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, php, Python, Ruby等语言服务器端语言, 便于服务器端的解析

4. 在PHP世界, 已经有PHP-JSON和JSON-PHP出现了, 便于PHP序列化后的程序直接调用. PHP服务器端的对象、数组等能够直接生JSON格式, 便于客户端的访问提取.   另外PHP的PEAR类已经提出了支持 (http://pear.php.net/pepr/pepr-proposal-show.php?id=198)

5. 因为JSON格式能够直接为服务器端代码使用, 大大简化了服务器端和客户端的代码开发量, 但是完成的任务不变, 且易于维护

缺点:

1. 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用性2. JSON格式目前在Web Service中推广还属于初级阶段PS: 据说Google的Ajax是使用 JSON+模板 做的

JSON实际使用情况:在实际调用接口中,传输数据经常会用到json,例如请求腾讯云短信发送接口,请求参数数据格式就是json,如下图:

JSON封装数据和解析数据_C语言

在实际使用中怎么判断json格式是否正确呢?百度JSON在线工具,直接校验,如下图:

JSON封装数据和解析数据_C语言

老铁,这个json格式,没毛病,提示是不是很直接。。。。。。。哈哈。

C++ 使用Json封装数据和解析数据

使用C++和别的语言做交互比较常用的一种数据操作方式就是json。可以到GitHub上下载对应C++的json库源码,我自己下了一套之前的版本,可以正常使用。jsoncpp-src

编译出来的库名:json_vc71_libmtd.lib(debug) | json_vc71_libmt.lib(release)

需要包含的头文件:jsoncpp-src(对应源码)/include/json (该目录下所有文件)

调用库方式
  •  
  •  
  •  
  •  
  •  
  •  
#include "json/json.h"#ifdef _DEBUG#pragma comment(lib,"./lib/json_vc71_libmtd.lib")#else#pragma comment(lib,"./lib/json_vc71_libmt.lib")#endif

 

封装json数据为string方法1:
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
std::string DataToJson(){    Json::FastWriter writerinfo;    Json::Value  writevalueinfo;    writevalueinfo["id"]=abc123;       writevalueinfo["time"]="2020.04.26 00:00:00";
Json::Value writedata; writedata["count"] = 1; writedata["name"] = "cpp";
writevalueinfo["data"]=writedata;
std::string strEmail = writerinfo.write(writevalueinfo); return strEmail;}
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
示例json://公众号:C与C语言plus{    "data": {        "count": 1,        "name": "cpp"    },    "id": abc123,    "time": "2020.04.26 00:00:00"}

方法2(直接拼接):

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
CString strTempData;msg_content =  ” 1号设备水位超过阈值报警”;cstrsha256 =  “20823c7cf53e97898f39f212b9dbee960220b3fa272c884c62f1f3fe6af56f38”;strmobile =  “ 13004091102”;strtime =  “1587711951 ”;strTempData.Format("{\"tpl_id\": %ld,\"params\":\[ \"%s\"\],\"playtimes\": %d,\"sig\": \"%s\",\"tel\":\{\"mobile\":\"%s\",\"nationcode\":\"%d\"\},\"time\": %ld, \"ext\":\"\"\}",568369,msg_content,2,cstrsha256,strmobile,86,strtime);

 

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
示例json:  //公众号:C与C语言plus{  "tpl_id": 568369,  "params": ["1号设备水位超过阈值报警 "],  "playtimes": 2,  "sig": "20823c7cf53e97898f39f212b9dbee960220b3fa272c884c62f1f3fe6af56f38",  "tel": {    "mobile": "13004091102",    "nationcode": "86"  },  "time": 1587711951,  "ext": ""}
解析json数据
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
void TranslateJson(const string strData){    // 解析json用Json::Reader    Json::Reader *readerinfo = new Json::Reader(Json::Features::strictMode());    // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array...    Json::Value root;           if (readerinfo->parse(strData, root))    {        if (root["id"].isInt())        {            int nID = root["id"].asInt();        }        if (root["time"].isString())        {            std::string strTime = root["time"].asString();        }        if (root["data"]["count"].isInt())        {            int nDataCount = root["data"]["count"].asInt();        }
if (root["data"]["name"].isString()) { std::string strDataName = root["data"]["name"].asString(); }
} ::delete readerinfo; readerinfo = NULL;}