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我都没有认真接触过, ...
随机推荐
- MVC小系列(五)【在过滤器里引入重定向】
在过滤器里引入重定向 过滤器的引入:如果用户进行一个操作,但没有登录,可以在Post方法上加个过滤器以验证用户是否登录,如果登录成功,则继续进行操作,如果没有登录,则实现Url的重定向,进行登录页 授 ...
- O-C相关-07-@property关键字简介与使用
基本概念:在O-C中,创建完类之后还需要给一个类添加属性和方法,之前说过的set和get方法比较繁琐,因此引入了@property 这个编译器指令.@property 是一个编译器指令.所谓的编译器指 ...
- RPC实现原理(HSF、dubbo) 从头开始(一)
前言 阔别了很久博客园,虽然看了以前写的很多东西感觉好幼稚,但是还是觉得应该把一些自己觉得有用的东西和大家分享.废话不多说,现在开始进入正题. 之前的六年工作经验,呆过了一些大公司,每个在大公司呆过的 ...
- Struts2的运行原理和运行与原理
Struts2 struts2的流程图 运行机制 1.客户端发送请求.通过ActionContextLoader调用FilterDispatcher(struts) 2.FilterDispatche ...
- ubuntu 13.10自定义启动顺序
添加PPA sudo add-apt-repository ppa:danielrichter2007/grub-customizer sudo apt-get update sudo apt-get ...
- 模板:优先队列(priority_queue)
#include <iostream> #include <cstdio> #include <queue> #include <vector> usi ...
- 基于HTML5和JSP实现的图片Ajax上传和预览
本文对如何实现使用Ajax提交"multipart/form"格式的表单数据,已经如何在图片上传之前,在浏览器上进行预览.使用的主要相关技术HTML5的FILE API,XMLHt ...
- C#使用Json
AJAX传递复杂数据如果自己进行格式定义的话会经历组装.解析的过程,因此AJAX中有一个事实上的数据传输标准JSon. Json将复杂对象序列化为一个字符串,在浏览器端再将字符串反序列化为JavaSc ...
- 深度优化LNMP之Nginx [2]
深度优化LNMP之Nginx [2] 配置Nginx gzip 压缩实现性能优化 1.Nginx gzip压缩功能介绍 Nginx gzuo压缩模块提供了压缩文件内容的功能,用户请求 ...
- 使用sui实现的选择控件【性别、日期、省市级联】
使用sui mobile做的选择控件,其中sm.js有修改,增加自定义api,详情请看index.html的注释,不多说了,上代码 <!DOCTYPE html> <html> ...