JsonCpp 入门教程
1.JsonCpp 简介
首先说一下 JSON。JSON(JavaScript Object Notation) 基于 ECMAScript 的一个子集,是一种独立于语言的轻量级的数据交换格式,易于阅读和编写,并且机器很容易解析和生成。这些特性使 JSON 成为理想的数据交换语言,一般用于网络传输。
JsonCpp 是用于生成和解析 JSON 的 C++ 开源库,参见官网,源代码托管在Github。
除了 JsonCpp,可供我们选择的第三方开源的用于解析和生成 JSON 的 C++ 库还有很多。比如SimpleJSON、json-spirit 和腾讯的 RapidJSON,当然还有 C 语言的 cJSON 和 libJSON。这里之所以介绍 JsonCpp是因为使用的人较多,相比腾讯的 RapidJSON,本来是想用 RapidJSON,但是到github上一看,被那纷杂的头文件给吓到了,虽然 JsonCpp的头文件也很多,但是相对来说还是少很多。还有一点,JsonCpp用的人多,网上解决问题的资源也相对多一点。
这里贴一张 RapidJSON 的作者 Milo Yip 对网上开源的 JSON 库的测评图,测试环境Corei5-3330S@2.70GHz_mac64_clang6.1_1
。
解析 JSON 字符串的时间:
具体参见 github Milo Yip native-json benchmark。
1.1JsonCpp 的内容
(1)JsonCpp主要包含三种类型:Value、Reader和Writer;
Json::Value是 JsonCpp 中最基本、最重要的类,用于表示各种类型的对象,JsonCpp 支持的对象类型可见 Json::ValueType 枚举值。
Json::Reader是用于读取的,说的确切点,是用于将字符串转换为 Json::Value 对象的。
Json::Writer类是一个纯虚类,并不能直接使用。在此我们使用 Json::Writer 的子类:Json::FastWriter、Json::StyledWrite、Json::StyledStreamWriter。
(2)Jsoncpp 中所有对象、类名都在 namespace json 中,包含 json.h 即可
2.JsonCpp 下载与编译
第一步,请到 Github 上下载 JsonCpp 源码。
Github 上托管的是整个 JsonCpp 项目,包括了很多乱七八糟的文件,比如说明文件 README.md,示例代码,构建文件 cmake.txt,还有各种乱起八糟的脚本文件,不得不吐槽一下,真的很乱。我们需要的仅仅只是其源码,在说明文件中还没有显明的指出源码的所在目录,这点做的不好啊,看了很多其它的开源项目,不仅仅是 JsonCpp 没有说明,很多都没有说明。还要自己去摸索,筛选自己真真需要的那几个源码文件,真的很令人头痛。
好了,我们需要的源码文件有目录/include/json/
下的所有头文件,还有目录/src/lib_json/
下的源文件。这里我又要吐槽一下(可能我有简洁强迫症),源文件目录下还放脚本 sconscript 做甚,更有甚者,还放了个头文件json_tool.h
。作者对项目文件的组织管理能力真不敢恭维啊!要是我,源文件目录绝对只放源文件,还参杂其它的文件做咩。
源文件目录/src/lib_json/
不需要要的文件见下图的红框,请把它删掉吧,碍眼!
其中 CMakeLists.txt 是 CMake 用于构建项目的脚本,sconscript 是 scons 构建项目的脚本,version.h.in 是Github 自动生成的版本信息。删删删,统统删了,用不到。当然你如果使用 cmake 来构建项目的话, CMakeLists.txt 还是有用的。Linux下,我是不用 cmake,虽然它简单好用,但是在每个目录下都要加个CMakeLists.txt,真的很碍眼(个人感觉)。而且 cmake 最终也是要生成 makefile 来构建项目,为何不手写一个 makefile 全部搞定。
第二步, 编译。将上面说明的我们需要的源文件和头文件包含到自己的项目中就可以使用啦。当然你也可以单独将 JsonCpp 编译成静态链接库或者动态链接库来使用。这里贴一下我用于编译的 makefile,喜欢手写makefile 的朋友可以参考一下。
##################################
# @brief:make scripts
# @date:2016.06.25
# @author:dablelv
###################################environment var
VPATH+=src:src/lib_jsonCC:=g++
FLAGS=-g -Wall -std=c++11
INC+=-Iinc
LIBDIR+=CPPDIRS=src src/lib_jsonTARGET:=jsoncpptest.outCPPS=$(shell for dir in ${CPPDIRS};do echo $${dir}/*.cpp;done)OBJDIR=obj
OBJS=$(patsubst %.cpp,${OBJDIR}/%.o,$(notdir ${CPPS}))${TARGET}:${OBJS}${CC} ${FLAGS} ${OBJS} -o $@ ${LIBDIR}${OBJDIR}/%.o:%.cpp${CC} ${FLAGS} ${INC} -o $@ -c $<.PHONY:clean
clean:rm -f ${TARGET} ${OBJDIR}/*
3.JsonCpp 使用实例
下面直接上代码。
#include <string.h>#include <string>
#include <iostream>
using namespace std;#include "json/json.h"struct Student{char ID[20];char name[10];int age;int gender;char major[10];
};string serializeToJson(const Student& student);
Student deserializeToObj(const string& strJson);int main(int argc, char** argv) {Student student;strcpy(student.ID,"312822199204085698");strcpy(student.name,"dablelv");student.age=18;student.gender=0;strcpy(student.major,"math");string strJson=serializeToJson(student);cout<<"strJson:"<<strJson<<endl;string strJsonNew="{\"ID\":\"201421031059\",\"name\":\"lvlv\",\"age\":18,\"gender\":0}";Student resStudent=deserializeToObj(strJsonNew);cout<<"resStudent:"<<endl;cout<<"ID:"<<resStudent.ID<<endl;cout<<"name:"<<resStudent.name<<endl;cout<<"age:"<<resStudent.age<<endl;cout<<"gender:"<<resStudent.gender<<endl;cout<<"major:"<<resStudent.major<<endl;return 0;
}//@brief:将给定的学生对象序列化为json字符串
//@param:student:学生对象
//@ret:json字符串
string serializeToJson(const Student& student){//Json::Value root;Json::FastWriter writer;Json::Value person;person["ID"] = student.ID;person["name"] = student.name;person["age"]=student.age;person["gender"]=student.gender;person["major"]=student.major;//root.append(person);string strJson=writer.write(root);return strJson;
}//@brief:将给定的json字符串反序列化为学生对象
//@param:strJson:json字符串
//@ret:学生对象
Student deserializeToObj(const string& strJson){Json::Reader reader;Json::Value value;Student student;memset(&student,0,sizeof(Student));if (reader.parse(strJson, value)){strcpy(student.ID,value["ID"].asString().c_str());strcpy(student.name,value["name"].asString().c_str()); student.age=value["age"].asInt(); student.gender=value["gender"].asInt();strcpy(student.major,value["major"].asString().c_str());}return student;
}
程序输出结果:
上面的 major 输出之所以为空,是因为 JSON 字符串中没有 major 字段。
参考文献
[1] JsonCpp官网
[2] JsonCpp Github
[3] native-json benchmark
[4] C++ Jsoncpp 源代码编译与解析 Json
JsonCpp 入门教程相关推荐
- Kafka入门教程与详解
1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...
- 【CV】Pytorch一小时入门教程-代码详解
目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...
- python tornado教程_Tornado 简单入门教程(零)——准备工作
前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...
- python向量计算库教程_NumPy库入门教程:基础知识总结
原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...
- mysql query browswer_MySQL数据库新特性之存储过程入门教程
MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...
- python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...
- air调用java,AIR2.0入门教程:与Java应用交互
在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...
- 【Arduino】开发入门教程【一】什么是Arduino
Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...
- python 三分钟入门_Cython 三分钟入门教程
作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...
最新文章
- Python 多线程抓取网页 牛人 use raw socket implement http request great
- Java同步工具类——信号量
- ubuntu 12.04 memcached安装
- 【Centos】yum 安装mariaDB
- android camera2 qcom,lineage编译环境里,编译QCamera2的技术总结
- eas库存状态调整单不能反审核_把握 商品 周转,做好 动态 库存 管理
- Python 装饰器总结
- Win7下PDF文件无法显示缩略图的解决方法
- 尝试一下暴力破解Wifi
- 【PowerBI】钉钉邮箱已经不能注册 Power BI 账号
- Nature封面论文在毫米尺度验证广义相对论
- WORD中的多级列表详解
- 普拉纳夫:第六感技术的惊异潜力
- 自然语言处理——实现美国总统就职演说词汇分布图
- anaconda:一直处于adding featured channel状态
- ENVI气溶胶反演相关示例教材
- STM32应用开发实践教程:基于 CAN 总线的多机通信应用开发
- TDK优化 模块化思想 阿里巴巴矢量库 css文件引入顺序 外边距塌陷
- (一)MATLAB规划
- 实习面试结束后的一些思考(已拿腾讯实习 offer)