【JSONCpp】简介及demo
一、JSON简介
JSON
一种轻量级的数据交换格式,易于阅读、编写、解析,全称为JavsScript ObjectNotation。
JSON由两种基本结构组成
① 名字/值 对的集合,可以理解为对象
② 值的组合, 可以理解为数组
示例
string strTemp =
"{ \"name\" : \"cuihao\" ," \
" \"age\" : 28 }"; string strRoot =
"{ \"key_string\" : \"value_string\", " \
" \"key_number\" : 28, " \
" \"key_boolean\" : false, " \
" \"key_double\" : 12.345, " \
" \"key_object\" : json_temp, " \
" \"key_array\" : [\"array_string1\", \"array_string2\", 12345]}";
二、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而已。
在VC中使用JSONCPP
下载源码后,进入D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\makefiles\vs71类似目录用VS打开.sln文件进行编译。
注意:
Debug下可以直接编译
Release下:将lib_json项目属性:配置属性—C/C++--输出文件:汇编输出选择【无列表】,应为为No List。

使用JSONCPP时,添加
头文件目录:D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include
库目录:
Debug: D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\build\vs71\debug\lib_json
#pragma commebt(lib, “json_vc71_libmtd.lib”) 对应/MDd
Release: D:\SourceSoftware\jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\build\vs71\release\lib_json
#pragma commebt(lib, “json_vc71_libmt.lib”) 对应/MT
三、上代码
#include "stdafx.h"
#include <iostream>
#include <string>
#include <json\json.h>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{ string strStudent = "{ \"name\" : \"cuishihao\", \"age\" : 28, \"major\" : \"cs\" }";
//char* strStudent = "{ \"name\" : \"cuishihao\", \"age\" : 28, \"major\" : \"cs\" }"; Json::Reader reader;
Json::Value value;
bool bRet = reader.parse(strStudent, value);
if (false == bRet)
{
cerr << endl << "read value error \n";
return -;
} cout << value["name"].asString()<<endl;
cout << value["age"].asInt()<<endl;
cout << value["major"].asString()<<endl; cout << endl; Json::Value json_temp;
json_temp["name"] = Json::Value("cuihao");
json_temp["age"] = Json::Value(); Json::Value root;
root["key_string"] = Json::Value("value_string");
root["key_number"] = Json::Value();
root["key_boolean"] = Json::Value(true);
root["key_double"] = Json::Value(12.345);
root["key_object"] = json_temp;
root["key_array"].append("array_string1");
root["key_array"].append("array_string2");
root["key_array"].append();
Json::ValueType type = root.type(); Json::Value arrValue = root["key_array"];
for (Json::Value::UInt i = ; i < arrValue.size(); ++ i)
{
if (arrValue[i].isString())
cout << arrValue[i].asString(); else if (arrValue[i].isInt())
cout << arrValue[i].asInt(); cout << endl;
} cout << endl << "----------------------------------- " <<endl; string strTemp =
"{ \"name\" : \"cuihao\" ," \
" \"age\" : 28 }"; string strRoot =
"{ \"key_string\" : \"value_string\", " \
" \"key_number\" : 28, " \
" \"key_boolean\" : false, " \
" \"key_double\" : 12.345, " \
" \"key_object\" : json_temp, " \
" \"key_array\" : [\"array_string1\", \"array_string2\", 12345]}"; Json::StyledWriter writer;
cout << endl << writer.write(root) << endl; cout << endl << "----------------------------"<<endl; Json::Value::Members members = root.getMemberNames(); for(Json::Value::Members::const_iterator iter = members.begin();
iter != members.end();
++ iter)
{
string strName = *iter; if (root[strName].isInt())
cout << root[strName].asInt(); else if (root[strName].isString())
cout << root[strName].asString(); else if (root[strName].isDouble())
cout << root[strName].asDouble(); else if(root[strName].isBool())
cout << root[strName].asBool(); else if(root[strName].isArray())
{
for(Json::Value::ArrayIndex i = ; i < root[strName].size(); ++ i)
{
if(root[strName][i].isInt())
cout << root[strName][i].asInt();
else if(root[strName][i].isString())
cout << root[strName][i].asString();
else
cout << "others"; cout << endl;
}
} else if (root[strName].isObject())
{
Json::Value::Members mbs = root[strName].getMemberNames();
for (Json::Value::Members::const_iterator iter2 = mbs.begin();
iter2 != mbs.end();
++ iter2)
{
string strName2 = *iter2;
if(root[strName][strName2].isInt())
cout << root[strName][strName2].asInt();
else if(root[strName][strName2].isString())
cout << root[strName][strName2].asString();
else
cout << "others"; cout << endl;
} //for
} //else if
else
cout << "others"; cout << endl;
} return ;
}
执行结果

【JSONCpp】简介及demo的更多相关文章
- Disruptor并发框架(一)简介&上手demo
框架简介 Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易.这个系统是建立在JVM平台上,其核心是一 ...
- PyQt5简介及demo
PyQt5说明 pyqt5是一套Python绑定Digia QT5应用的框架.它可用于Python 2和3.本教程使用Python 3.Qt库是最强大的GUI库之一.pyqt5的官方网站http:// ...
- 国外源码精品-Android-PullToRefresh 简介与DEMO导入
转载地址:http://my.oschina.net/cuitongliang/blog/170708 (一)&&http://my.oschina.net/cuitongliang/ ...
- Flask简介,安装,demo,快速入门
1.Flask简介 Flask是一个相对于Django而言轻量级的Web框架. 和Django大包大揽不同,Flask建立于一系列的开源软件包之上,这其中 最主要的是WSGI应用开发库Werkzeug ...
- JWT令牌简介及demo
一.访问令牌的类型 二.JWT令牌 1.什么是JWT令牌 JWT是JSON Web Token的缩写,即JSON Web令牌,是一种自包含令牌. JWT的使用场景: 一种情况是webapi,类似之 ...
- Odata简介和Demo
转:http://www.cnblogs.com/shanyou/archive/2013/06/11/3131583.html 在SOA的世界中,最重要的一个概念就是契约(contract).在云计 ...
- bluebird-api简介及demo
var Promise = require("bluebird"); var fs = require("fs"); //方法Promise化 var read ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(附源码)
前段时间,有几个研究ESFramework的朋友对我说,ESFramework有点庞大,对于他们目前的项目来说有点“杀鸡用牛刀”的意思,因为他们的项目不需要文件传送.不需要P2P.不存在好友关系.也不 ...
- 轻量级通信引擎StriveEngine —— C/S通信demo(2) —— 使用二进制协议 (附源码)
在网络上,交互的双方基于TCP或UDP进行通信,通信协议的格式通常分为两类:文本消息.二进制消息. 文本协议相对简单,通常使用一个特殊的标记符作为一个消息的结束. 二进制协议,通常是由消息头(Head ...
随机推荐
- Mysql 分页语句Limit用法
转载自:http://qimo601.iteye.com/blog/1634748 1.Mysql的limit用法 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢?不用 ...
- Java学习笔记之:Java流程控制
一.介绍 Java流程控制包括顺序控制.条件控制和循环控制. 顺序控制,就是从头到尾依次执行每条语句操作.条件控制,基于条件选择执行语句,比方说,如果条件成立,则执行操作A,或者如果条件成立,则执行操 ...
- React gulp、Browserify、Webpack实例
一.gulp var gulp = require('gulp'); var react = require('gulp-react'); gulp.task('jsx', function() { ...
- Nmap扫描原理与用法
Nmap扫描原理与用法 1 Nmap介绍 Nmap扫描原理与用法PDF:下载地址 Nmap是一款开源免费的网络发现(Network Discovery)和安全审计(Security Audit ...
- Linux卸载系统自带的httpd的方法
卸载linux自带的httpd服务: 方法一: #rpm -e httpd 结果,出现以下错误 httpd-mmn = 20020628 is needed by (installed) mod_pe ...
- QTP10&QTP11&UFT11.5的安装和破解
QTP10的安装和破解方法 下载QTP10.0并安装. 安装成功后,在C:\Program Files\Common Files\Mercury Interactive下创建文件夹:License M ...
- C#画图解决闪烁问题
导致画面闪烁的关键原因分析: 一.绘制窗口由于大小位置状态改变进行重绘操作时,绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示 ...
- BZOJ3122 随机数生成器
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3122 题意: 思路:(1)x1=t则n=1; (2)a=0,则b=t,n=2;否则无解: ...
- Regex Failure - Bug Fixing #2
http://www.codewars.com/kata/55c423ecf847fbcba100002b/train/csharp Oh no, Timmy's received some hate ...
- 面试题_103_to_124_关于 OOP 和设计模式的面试题
这部分包含 Java 面试过程中关于 SOLID 的设计原则,OOP 基础,如类,对象,接口,继承,多态,封装,抽象以及更高级的一些概念,如组合.聚合及关联.也包含了 GOF 设计模式的问题. 103 ...