C++构造和解析JSON
JSON是一种轻量级的数据交互格式,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率,实际项目中经常用到,相比xml有很多优点,问问度娘,优点一箩筐。
第三方库
json解析选用jsoncpp作为第三方库,jsoncpp使用广泛,c++开发首选。
jsoncpp目前已经托管到了github上,地址:https://github.com/open-source-parsers/jsoncpp
使用
使用c++进行构造json和解析json,选用vs2010作为IDE。工程中使用jsoncpp的源码进行编译,没有使用jsoncpp的库,为方便大家使用把dll和lib库也放到了我的工程jsoncpplib文件夹下,有需要的可以直接引用库。
待解析的json数据格式如下图:

/********************************************************
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;
}
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()
{
char* json = getfileAll("parseJson.json");
parseJSON(json);
printf("===============================\n");
createJSON();
getchar();
return 1;
}
关注下面公众号,回复"104"获取源码

C++构造和解析JSON的更多相关文章
- Java构造和解析Json数据的两种方法详解二
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Jso ...
- Java构造和解析Json数据的两种方法详解一
一.介绍 JSON-lib包是一个beans,collections,maps,java arrays 和XML和JSON互相转换的包,主要就是用来解析Json数据,在其官网http://www.js ...
- Java构造和解析Json数据的两种方法详解二——org.json
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/24/3096437.html 在www.json.org上公布了很多JAVA下的jso ...
- Java构造和解析Json数据的两种方法详解一——json-lib
转自:http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html 在www.json.org上公布了很多JAVA下的jso ...
- Java构造和解析Json数据
BaseResult wyComany = propertyService.getWyCompanyById(CommunityInfos.getWyCompany());//这里返回的是json字符 ...
- 解析Json文件
一: /** * 把json文件读取到内存中 * * @throws IOException */ public String getFile(String filePath) throws IOEx ...
- Java创建和解析Json数据方法(三)——json-lib包的使用
(三)json-lib包的使用 这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject.JSONArray和Java对象:beans, maps ...
- JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象
JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象
- Android异步加载访问网络图片-解析json
来自:http://www.imooc.com/video/7871 推荐大家去学习这个视频,讲解的很不错. 慕课网提供了一个json网址可以用来学习:http://www.imooc.com/api ...
随机推荐
- Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
译文:https://blog.csdn.net/fangxing80/article/details/7581937 原文:http://www.atmarkit.co.jp/fdotnet/int ...
- Vue的Key属性,v-for和v-if,v-if/v-show,v-pre不渲染,v-once只渲染一次
key属性为什么要加 key -- api 解释 key的特殊属性主要用在vue的虚拟dom算法,如果不适用key,vue会使用一种最大限度减少动态元素并且尽可能的尝试修复/再利用相同类型元素的算法. ...
- vue-skeleton-webpack-plugin骨架屏与page-skeleton-webpack-plugin骨架屏生成插件
vue-skeleton-webpack-plugin与page-skeleton-webpack-plugin使用 插件github地址:https://github.com/lavas-proje ...
- lintcode-1038. 珠宝和石头
题目描述 给定字符串J代表是珠宝的石头类型,而S代表你拥有的石头.S中的每个字符都是你拥有的一个石头. 你想知道你的石头有多少是珠宝. J中的字母一定不同,J和S中的字符都是字母. 字母区分大小写,因 ...
- shell 命令行参数(getopt和getopts)
getopt 命令 使用getopt命令,可以解析任何命令行选项和参数,但是用法比较复杂.getopt的命令用法如下: $ getopt --help 用法: getopt optstring par ...
- TypeScript 真香系列——接口篇
接口带来了什么好处 好处One —— 过去我们写 JavaScript JavaScript 中定义一个函数,用来获取一个用户的姓名和年龄的字符串: const getUserInfo = funct ...
- nginx php-fpm 配置问题(2)
问题: Nginx/FPM/PHP all php files say 'File not found.' 解决: 可能情况 1: 在 nginx php-fpm 配置问题(1)文中,我们分析了一种可 ...
- 简单find命令的实现
贴代码: /*实现一个简单的find命令:*//*程序思路:首先,用一个单链表将所需要的信息存储起来:其次根据所传入的参数信息,改变节点的状态(若有这个状态,证明该节点就是我们所需要的)最后将所需要的 ...
- Redis简介及其安装
1.Redis NoSQL (Not noly SQL)不仅仅是SQL 属于非关系型数据库:Redis就属于非关系型数据库 传统的Mysql ,oracle ,sql server 等 都是关系型数据 ...
- [Beta]Scrum Meeting#1
github 本次会议项目由PM召开,时间为5月6日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 beta初步计划 撰写博客整理文档 swoip 前端改进计划 模块松耦合 ...