C++解析JSON之JsonCPP
一、JSON简介
JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读、编写、解析。
JSON由两种基本结构构成:
)"名称/值"对的集合,可以理解为对象。
)值的组合,可以理解为数组。
JSON对象简单示例
:
{
"header": {
"pid": "10",
"cas": "1"
},
"body": {
"bodyCode": "JSON",
"bodyName":"JavaScriptObject Notation",
"GUId": "1"
}
}
:
{
"header": {
"pid": "10",
"cas": "1"
},
"ack": [{
"ackCode": "JSON",
"ackName":"JavaScript ObjectNotation",
},{
"ackCode": "JSON",
"ackName":"JavaScript ObjectNotation",
}
"GUId":"1"
}
JSON更详细的介绍请看官网:http://www.json.org
二、JSONCPP
1. JsonCPP简介
jsoncpp是c++解析JSON串常用的解析库之一。其常用的类有:
a) Json::Value 可以表示里所有的类型,比如int,string,object,array等,其支持的类型可以参考Json:ValueType中的值。
b) Json::Reader 将json文件流或字符串解析到Json::Value,主要函数有Parse。
c) Json::Writer 与Json::Reader相反,将Json::Value转化成字符串流,注意它的两个子类:Json::FastWriter和Json::StyleWriter,分别输出不带格式的json和带格式的json。
d) Json::Value::Members 主要用于以STL风格解析JSON数组。看过源代码的人已知道,Members其实是typedefvector<string>而已。
2. JSONCPP解析示例
a) 解析JSON串格式
{
"JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207",
"Send" : {
"ID" : "B8E09E97-F379-4bb0-814A-389FD3F66631",
"Items" : [
{
"Count" : 2,
"Code" : "0101",
"X" : 1,
"Y" : 2
},
{
"Count" : 2,
"Code" : "0101",
"X" : 1,
"Y" : 2
}
]
}
}
b) 生成的JSON串
{
"Ack" : [
{
"ActualCount" : 2,
"Code" : "0101"
},
{
"ActualCount" : 2,
"Code" : "0101"
}
],
"JsonID" : "BD6D7FDA-54D2-468b-A3DE-9D5FBDB78207"
}
c) 解析、生成JSON代码
需要引入的.h文件
- #pragma once
- #pragma comment(lib, "json_vc71_libmtd.lib")
- #include "json/json.h"
实现
- void CJSONTestDlg::OnBnClickedButton1()
- {
- CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT1);
- CString str;
- pEdit->GetWindowText(str); //str即为a)中定义的JSON串
- pEdit->FmtLines(true);
- Json::Reader reader;
- Json::Value root;
- if (reader.parse(WC2UT(str.GetBuffer(0)), root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
- {
- std::string JsonID = root["JsonID"].asString();
- Json::Value rtnRoot;
- rtnRoot["JsonID"]=JsonID;
- Json::Value ack;
- Json::Value send = root["Send"];
- if(!send["Items"].isNull()){
- Json::Value Items = send["Items"];
- int sendSize = Items.size();
- for(int i=0;i<sendSize;i++){//循环获取到JSON串数组当中的值
- std::string Code = Items[i]["Code"].asString();
- int x = Items[i]["X"].asInt();
- int y = Items[i]["Y"].asInt();
- int count = Items[i]["Count"].asInt();
- //更具读到的JSON串中的值生成所需内容
- Json::Value newAckItem;
- newAckItem["Code"]=Code;
- newAckItem["ActualCount"]=count;
- ack.append(newAckItem);
- }
- }
- rtnRoot["Ack"]=ack;
- std::string rtnOut = rtnRoot.toStyledString();//生成带格式的JSON串
- #ifdef UNICODE
- std::wstring stemp = s2ws(rtnOut);
- LPCWSTR result = stemp.c_str();
- #else
- LPCWSTR result = rtnOut.c_str();
- #endif
- MessageBox(result,_T("根据JSON串,生成的对应JSON串信息"));
- CEdit* pEdit =(CEdit*)GetDlgItem(IDC_EDIT2);
- pEdit->SetWindowText(result);
- }else{
- CEdit* pRtnEdit =(CEdit*)GetDlgItem(IDC_EDIT2);
- pRtnEdit->SetWindowText(_T("JSON格式错误"));
- }
- }
将JSONCPP以静态库方式导入,需要注意项目中的代码生成中的运行库,和JSONCPP的静态库项目的代码生成的运行库要一致,否则将报如下错误
afxver_.h(81): fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds
项目中的Runtime Library需设置的一样

C++解析JSON之JsonCPP的更多相关文章
- C++的Json解析库:jsoncpp和boost
C++的Json解析库:jsoncpp和boost - hzyong_c的专栏 - 博客频道 - CSDN.NET C++的Json解析库:jsoncpp和boost 分类: 网络编程 开源库 201 ...
- C++使用 jsoncpp 解析json数据
整合自网路 一.安装的方法 1.安装 scons 下载地址:http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.ta ...
- C++ 解析Json——jsoncpp
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录.Jsoncpp是个跨 ...
- C++ 解析Json——jsoncpp(转)
原文:https://www.cnblogs.com/liaocheng/p/4243731.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和 ...
- C++ Jsoncpp源代码编译与解析Json
1.Json 数据表示方式介绍 这个可以看之前的一个文章里面有说明:Java解析(读取)Json数据 2.C++ Jsoncpp 2.1 Jsoncpp介绍 (1)JsonCpp主要包含三种类型的cl ...
- C++的Json解析库:jsoncpp和boost(转)
原文转自 http://blog.csdn.net/hzyong_c/article/details/7163589 JSON(JavaScript Object Notation)跟xml一样也是一 ...
- [转]C++的Json解析库:jsoncpp和boost
JSON(JavaScript Object Notation)跟xml一样也是一种数据交换格式,了解json请参考其官网http://json.org,本文不再对json做介绍,将重点介绍c++的j ...
- C++处理Json串——jsoncpp库
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,和xml类似,本文主要对VS2008中使用Jsoncpp解析json的方法做一下记录.Jsoncpp是个跨 ...
- 更好更快更高效解析JSON说明
现在来一个实例解析类,直接就把解析JSON到QVariant去了.唯一不足的是没有搞错误处理,具体方法也请各位自行参考json-c的发行文档,这样比较方便叙述,STL或者Boost我都没有认真接触过, ...
随机推荐
- ActionBar功能,效果图一览
这里提供了效果预览,如果由你需要的界面,详细的代码可以去看原文. http://blog.csdn.net/android2me/article/details/8874846 一.概述 1.App ...
- SQL Server调优系列基础篇 - 索引运算总结
前言 上几篇文章我们介绍了如何查看查询计划.常用运算符的介绍.并行运算的方式,有兴趣的可以点击查看. 本篇将分析在SQL Server中,如何利用先有索引项进行查询性能优化,通过了解这些索引项的应用方 ...
- iOS开发——文本高度
1.简单的计算文本高度 // 要计算的文本内容 NSString *testString = @"刘成利,软件工程专业毕业,iOS开发者,目前工作于北京,在证券金融领域从事iOS App开发 ...
- iOS开发——音频篇——音效的播放
一.简单介绍 简单来说,音频可以分为2种 (1)音效 又称“短音频”,通常在程序中的播放时长为1~2秒 在应用程序中起到点缀效果,提升整体用户体验 (2)音乐 比如游戏中的“背景音乐”,一般播放时间较 ...
- 虚拟机中如何Linux系统如何访问PC硬盘中的文件(如何将windows下的文件夹挂载到linux虚拟机下)
这段时间决定学习嵌入式,变打算安装个Linux系统先熟悉一下Linux系统的使用,但自己电脑上安装的win7系统又不想装双系统,一是闲麻烦,二是由于对Linux系统不熟悉担心会因为自己的误操作而损坏系 ...
- uboot下 Nand flash 启动 内核与根文件系统
u-boot版本: u-boot-2010.03_tekkamanninja修改的u-boot 1.将uboot通过j-link烧写到norflash,启动后 saveenv 将参数保存到 nandf ...
- mysql query insert中文乱码
mysql新建的表的charset都是utf8的. 在phpmyadmin里直接敲sql,中文可以insert进去的,但是在php代码里mysql_query同样的sql语句就是不行,保存到表里是乱码 ...
- 如何在Ubuntu上创建及管理LXC容器?
将LXC安装到Ubuntu上 $ sudo apt-get install lxc 安装完毕之后,运行lxc-checkconifg工具,检查当前Linux内核支持LXC的情况.要是一切都已被启用,内 ...
- CentOS 配置Apache+Mysql+PHP (yum)与卸载
一.安装Apache2 #yum -y install httpd 安装配置完成,启动httpd服务#service httpd start 二.安装Mysql1.安装mysql#yum -y ins ...
- python的一些学习资料(持续更新中)
Markdown在线编辑器 廖雪峰官方博客[基础入门好资料] python-guide[传说中的巨牛写的] the5fire的技术博客[全职python程序员博客]