JsonCpp使用方法详解
JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。jsoncpp是c++解析JSON串常用的解析库之一。
jsoncpp中主要的类:
Json::Value:可以表示所有支持的类型,如:int , double ,string , object, array等。其包含节点的类型判断(isNull,isBool,isInt,isArray,isMember,isValidIndex等),类型获取(type),类型转换(asInt,asString等),节点获取(get,[]),节点比较(重载<,<=,>,>=,==,!=),节点操作(compare,swap,removeMember,removeindex,append等)等函数。
Json::Reader:将文件流或字符串创解析到Json::Value中,主要使用parse函数。Json::Reader的构造函数还允许用户使用特性Features来自定义Json的严格等级。
Json::Writer:与JsonReader相反,将Json::Value转换成字符串流等,Writer类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter(将数据写入一行,没有格式),Json::StyledWriter(按json格式化输出,易于阅读)。
Json::Reader可以通过对Json源目标进行解析,得到一个解析好了的Json::Value,通常字符串或者文件输入流可以作为源目标。
如下Json文件example.json:
- {
- "encoding" : "UTF-8",
- "plug-ins" : [
- "python",
- "c++",
- "ruby"
- ],
- "indent" : { "length" : 3, "use_space": true }
- "tab":null
- }
使用Json::Reader对Json文件进行解析:
- Json::Value root;
- Json::Reader reader;
- std::ifstream ifs("example.json");//open file example.json
- if(!reader.parse(ifs, root)){
- // fail to parse
- }
- else{
- // success
- std::cout<<root["encoding"].asString()<<endl;
- std::cout<<root["indent"]["length"].asInt()<<endl;
- }
使用Json::Reader对字符串进行解析:
- Json::Value root;
- Json::Reader reader;
- const char* s = "{\"uploadid\": \"UP000000\",\"code\": 100,\"msg\": \"\",\"files\": \"\"}";
- if(!reader.parse(s, root)){
- // "parse fail";
- }
- else{
- std::cout << root["uploadid"].asString();//print "UP000000"
- }
Json::Writer 和 Json::Reader相反,是把Json::Value对象写到string对象中,而且Json::Writer是个抽象类,被两个子类Json::FastWriter和Json::StyledWriter继承。
简单来说FastWriter就是无格式的写入,这样的Json看起来很乱没有格式,而StyledWriter就是带有格式的写入,看起来会比较友好。
- Json::Value root;
- Json::Reader reader;
- Json::FastWriter fwriter;
- Json::StyledWriter swriter;
- if(! reader.parse("example.json", root)){
- // parse fail
- return 0;
- }
- std::string str = fwriter(root);
- std::ofstream ofs("example_fast_writer.json");
- ofs << str;
- ofs.close();
- str = swriter(root);
- ofs.open("example_styled_writer.json");
- ofs << str;
- ofs.close();
- 结果1:example_styled_writer.json:
- {
- "encoding" : "UTF-8",
- "plug-ins" : [
- "python",
- "c++",
- "ruby"
- ],
- "indent" : { "length" : 3, "use_space": true }
- "tab":null
- }
- 结果2:example_fast_writer.json:
- {"encoding" : "UTF-8","plug-ins" : ["python","c++","ruby"],"indent" : { "length" : 3, "use_space": true}}
Json其它函数的应用:
1、判断KEY值是否存在:
- if(root.isMember("encoding")){
- std::cout<<"encoding is a member"<<std::endl;
- }
- else{
- std::cout<<"encoding is not a member"<<std::endl;
- }
2、判断Value是否为null:
if(root["tab"].isNull()){
std::cout << "isNull" <<std::endl;//print isNull
}
完整例子使用举例来自于CSDN下载网友的程序:
源码下载地址:http://download.csdn.net/download/woniu211111/9966907
- /********************************************************
- Copyright (C), 2016-2017,
- FileName: main
- Author: woniu201
- Email: wangpengfei.201@163.com
- Created: 2017/09/06
- Description:use jsoncpp src , not use dll, but i also provide dll and lib.
- ********************************************************/
- #include "stdio.h"
- #include <string>
- #include "jsoncpp/json.h"
- using namespace std;
- /************************************
- @ Brief: read file
- @ Author: woniu201
- @ Created: 2017/09/06
- @ Return: file data
- ************************************/
- char *getfileAll(char *fname)
- {
- FILE *fp;
- char *str;
- char txt[1000];
- int filesize;
- if ((fp=fopen(fname,"r"))==NULL){
- printf("open file %s fail \n",fname);
- return NULL;
- }
- /*
- 获取文件的大小
- ftell函数功能:得到流式文件的当前读写位置,其返回值是当前读写位置偏离文件头部的字节数.
- */
- fseek(fp,0,SEEK_END);
- filesize = ftell(fp);
- str=(char *)malloc(filesize);
- str[0]=0;
- rewind(fp);
- while((fgets(txt,1000,fp))!=NULL){
- strcat(str,txt);
- }
- fclose(fp);
- return str;
- }
- /************************************
- @ Brief: write file
- @ Author: woniu201
- @ Created: 2017/09/06
- @ Return:
- ************************************/
- int writefileAll(char* fname,const char* data)
- {
- FILE *fp;
- if ((fp=fopen(fname, "w")) == NULL)
- {
- printf("open file %s fail \n", fname);
- return 1;
- }
- fprintf(fp, "%s", data);
- fclose(fp);
- return 0;
- }
- /************************************
- @ Brief: parse json data
- @ Author: woniu201
- @ Created: 2017/09/06
- @ Return:
- ************************************/
- int parseJSON(const char* jsonstr)
- {
- Json::Reader reader;
- Json::Value resp;
- if (!reader.parse(jsonstr, resp, false))
- {
- printf("bad json format!\n");
- return 1;
- }
- int result = resp["Result"].asInt();
- string resultMessage = resp["ResultMessage"].asString();
- printf("Result=%d; ResultMessage=%s\n", result, resultMessage.c_str());
- Json::Value & resultValue = resp["ResultValue"];
- for (int i=0; i<resultValue.size(); i++)
- {
- Json::Value subJson = resultValue[i];
- string cpuRatio = subJson["cpuRatio"].asString();
- string serverIp = subJson["serverIp"].asString();
- string conNum = subJson["conNum"].asString();
- string websocketPort = subJson["websocketPort"].asString();
- string mqttPort = subJson["mqttPort"].asString();
- string ts = subJson["TS"].asString();
- printf("cpuRatio=%s; serverIp=%s; conNum=%s; websocketPort=%s; mqttPort=%s; ts=%s\n",cpuRatio.c_str(), serverIp.c_str(),
- conNum.c_str(), websocketPort.c_str(), mqttPort.c_str(), ts.c_str());
- }
- return 0;
- }
- /************************************
- @ Brief: create json data
- @ Author: woniu201
- @ Created: 2017/09/06
- @ Return:
- ************************************/
- int createJSON()
- {
- Json::Value req;
- req["Result"] = 1;
- req["ResultMessage"] = "200";
- Json::Value object1;
- object1["cpuRatio"] = "4.04";
- object1["serverIp"] = "42.159.116.104";
- object1["conNum"] = "1";
- object1["websocketPort"] = "0";
- object1["mqttPort"] = "8883";
- object1["TS"] = "1504665880572";
- Json::Value object2;
- object2["cpuRatio"] = "2.04";
- object2["serverIp"] = "42.159.122.251";
- object2["conNum"] = "2";
- object2["websocketPort"] = "0";
- object2["mqttPort"] = "8883";
- object2["TS"] = "1504665896981";
- Json::Value jarray;
- jarray.append(object1);
- jarray.append(object2);
- req["ResultValue"] = jarray;
- Json::FastWriter writer;
- string jsonstr = writer.write(req);
- printf("%s\n", jsonstr.c_str());
- writefileAll("createJson.json", jsonstr.c_str());
- return 0;
- }
- int main()
- {
- /*读取Json串,解析Json串*/
- char* json = getfileAll("parseJson.json");
- parseJSON(json);
- printf("===============================\n");
- /*组装Json串*/
- createJSON();
- getchar();
- return 1;
- }
参考:
http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
http://blog.csdn.net/yc461515457/article/details/52749575
JsonCpp使用方法详解的更多相关文章
- session的使用方法详解
session的使用方法详解 Session是什么呢?简单来说就是服务器给客户端的一个编号.当一台WWW服务器运行时,可能有若干个用户浏览正在运正在这台服务器上的网站.当每个用户首次与这台WWW服务器 ...
- Kooboo CMS - Html.FrontHtml[Helper.cs] 各个方法详解
下面罗列了方法详解,每一个方法一篇文章. Kooboo CMS - @Html.FrontHtml().HtmlTitle() 详解 Kooboo CMS - Html.FrontHtml.Posit ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- ecshop后台增加|添加商店设置选项和使用方法详解
有时候我们想在Ecshop后台做个设置.radio.checkbox 等等来控制页面的显示,看看Ecshop的设计,用到了shop_config这个商店设置功能 Ecshop后台增加|添加商店设置选项 ...
- (转)Spring JdbcTemplate 方法详解
Spring JdbcTemplate方法详解 文章来源:http://blog.csdn.net/dyllove98/article/details/7772463 JdbcTemplate主要提供 ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- windows.open()、close()方法详解
windows.open()方法详解: window.open(URL,name,features,replace)用于载入指定的URL到新的或已存在的窗口中,并返回代表新窗口的Win ...
- CURL使用方法详解
php采集神器CURL使用方法详解 作者:佚名 更新时间:2016-10-21 对于做过数据采集的人来说,cURL一定不会陌生.虽然在PHP中有file_get_contents函数可以获取远程 ...
- JAVA 注解的几大作用及使用方法详解
JAVA 注解的几大作用及使用方法详解 (2013-01-22 15:13:04) 转载▼ 标签: java 注解 杂谈 分类: Java java 注解,从名字上看是注释,解释.但功能却不仅仅是注释 ...
随机推荐
- Mysql/Mariadb 升级注意事项
因需要使用到分区表,在业务不中断的情况下,可以新增分区,需要将原来的Mariadb10.1.25版本升级到Mariadb10.3.8. 1.升级步骤如下 1)新搭建Mariadb10.3.8版本的DB ...
- Java——IO类,转换流简化写法
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...
- How to understand three foundanmental faults?
1.First ,try to understand "Green function and the moment tensor" in Seismology,9.1 2.seco ...
- js写的一个HashMap
1.脚本 /** * 模拟HashMap */ function HashMap(){ //定义长度 var length = 0; //创建一个对象 var obj = new Object(); ...
- SQL语句执行过程详解
一.SQL语句执行原理: 第一步:客户端把语句发给服务器端执行 当我们在客户端执行select语句时, 客户端会把这条SQL语句发送给服务器端,让服务器端的进程来处理这语句.也就是说,Oracle客户 ...
- PAT 说反话-加强版 (20分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母 ...
- Unity3D插件-自制小插件、简化代码便于使用(新手至高手进阶必经之路)
Unity3D插件-简化代码.封装功能 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 FindT() ...
- 使用pip install XX 命令时报错
在使用pip命令安装的时候,我遇到这样的报错: C:\Users\86962>pip install Appium-Python-Client Collecting Appium-Python- ...
- centos7 使用mount 挂载window10 (超简单)
一直使用vmware tools 挂载,发现好多问题,折腾了大半天放弃了,现在使用mount挂载,发现简单多了 一丶首先添加你需要共享的Windows文件夹,右键 记得要选择 Everyone 和一个 ...
- 关于递归函数中的return位置
1.对于求是否有解的问题一般使用bool dfs() 其中return 可以放在递归式后面 2.对于需要更新解的问题一般使用int dfs() 其中return 不能放在递归式后面,必须放在函数最 ...