【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 ...
随机推荐
- Android中数据存储之SharedPreferences
import android.content.Context; import android.content.SharedPreferences; import android.content.Sha ...
- lintcode:合并区间
题目: 合并区间 给出若干闭合区间,合并所有重叠的部分. 样例 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [ ...
- [Unity菜鸟] Final IK
由于本人英文较烂,边翻译用户手册边学习. 用户手册 IK Components Final IK 包含许多强大高速的IK组件 Aim AimIK solver是一个对CCD算法(cyclic co ...
- Java学习笔记之:java环境搭建
一.准备工作 在学习java之前需要安装对配置java的运行环境,所以我们需要安装以下软件: 1.java jdk 2.eclipse 二.配置环境变量 1.首先,找到你刚才安装的JDK的安装目录,我 ...
- 248. Strobogrammatic Number III
题目: A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at ups ...
- org.json和json-lib比较
经常会用到JSON格式才处理,尤其是在Http请求的时候,网上可以找到很多json处理的相关工具,如org.json和json-lib,下面两段源代码是分别使用这两个工具解析和构造JSON的演示程序. ...
- 2008年我买了一本书 书名叫“PHP 6”
上个星期天,我感觉应该整理一下我的书柜.于是,在书柜里,我发现了一本几乎完全忘记的书(我想不起来为什么要买它!):<PHP 6 – 快速简洁的Web开发> 这本书出版于2008年一月.而六 ...
- JVM学习笔记(三)------内存管理和垃圾回收
JVM内存组成结构 JVM栈由堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)堆 所有通过new创建的对象的内存都在堆中分配,其大小可以通过-Xmx和-Xms来控制.堆被划分为新生代和旧生 ...
- url、href、src 详解
发现自己居然没把url.href.src关系及使用搞清楚,今天就理一下.主要包括:url.src.href定义以及使用区别.顺便试下在segmentfault来一发. URL(Uniform Reso ...
- Drawit插件
gvim用不了画矩形的功能,只能在vim下用 \di,\ds开始/结束画图(Vim里\按键没有被映射,可以做leader按键) 用鼠标选择一块之后,\b画矩形,\e画椭圆 选单行\a画箭头,\l画线 ...