1.JsonCpp 简介

首先说一下 JSON。JSON(JavaScript Object Notation) 基于 ECMAScript 的一个子集,是一种独立于语言的轻量级的数据交换格式,易于阅读和编写,并且机器很容易解析和生成。这些特性使 JSON 成为理想的数据交换语言,一般用于网络传输。

JsonCpp 是用于生成和解析 JSON 的 C++ 开源库,参见官网,源代码托管在Github。

除了 JsonCpp,可供我们选择的第三方开源的用于解析和生成 JSON 的 C++ 库还有很多。比如SimpleJSONjson-spirit腾讯的 RapidJSON,当然还有 C 语言的 cJSONlibJSON。这里之所以介绍 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 入门教程相关推荐

  1. Kafka入门教程与详解

    1 Kafka入门教程 1.1 消息队列(Message Queue) Message Queue消息传送系统提供传送服务.消息传送依赖于大量支持组件,这些组件负责处理连接服务.消息的路由和传送.持久 ...

  2. 【CV】Pytorch一小时入门教程-代码详解

    目录 一.关键部分代码分解 1.定义网络 2.损失函数(代价函数) 3.更新权值 二.训练完整的分类器 1.数据处理 2. 训练模型(代码详解) CPU训练 GPU训练 CPU版本与GPU版本代码区别 ...

  3. python tornado教程_Tornado 简单入门教程(零)——准备工作

    前言: 这两天在学着用Python + Tornado +MongoDB来做Web开发(哈哈哈这个词好高端).学的过程中查阅了无数资料,也收获了一些经验,所以希望总结出一份简易入门教程供初学者参考.完 ...

  4. python向量计算库教程_NumPy库入门教程:基础知识总结

    原标题:NumPy库入门教程:基础知识总结 视学算法 | 作者 知乎专栏 | 来源 numpy可以说是 Python运用于人工智能和科学计算的一个重要基础,近段时间恰好学习了numpy,pandas, ...

  5. mysql query browswer_MySQL数据库新特性之存储过程入门教程

    MySQL数据库新特性之存储过程入门教程 在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用 ...

  6. python tensorflow教程_TensorFlow入门教程TensorFlow 基本使用T

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 TensorFlow入门教程 TensorFlow 基本使用 TensorFlow官方中文教程 TensorFlow 的特点: 使用图 (graph) 来 ...

  7. air调用java,AIR2.0入门教程:与Java应用交互

    在之前的一篇文章中,我介绍了如何使用AIR2.0新增的NativeProcess类与本地进程进行交互和通讯,在那个例子里面我们使用了C++ 的代码,实际上只要是基于命令行的标准输入输出,AIR2.0的 ...

  8. 【Arduino】开发入门教程【一】什么是Arduino

    Arduino Arduino 是一款便捷灵活.方便上手的开源电子原型平台,包含硬件(各种型号的arduino板)和软件(arduino IDE).它适用于艺术家.设计师.爱好者和对于"互动 ...

  9. python 三分钟入门_Cython 三分钟入门教程

    作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它 ...

最新文章

  1. Python 多线程抓取网页 牛人 use raw socket implement http request great
  2. Java同步工具类——信号量
  3. ubuntu 12.04 memcached安装
  4. 【Centos】yum 安装mariaDB
  5. android camera2 qcom,lineage编译环境里,编译QCamera2的技术总结
  6. eas库存状态调整单不能反审核_把握 商品 周转,做好 动态 库存 管理
  7. Python 装饰器总结
  8. Win7下PDF文件无法显示缩略图的解决方法
  9. 尝试一下暴力破解Wifi
  10. 【PowerBI】钉钉邮箱已经不能注册 Power BI 账号
  11. Nature封面论文在毫米尺度验证广义相对论
  12. WORD中的多级列表详解
  13. 普拉纳夫:第六感技术的惊异潜力
  14. 自然语言处理——实现美国总统就职演说词汇分布图
  15. anaconda:一直处于adding featured channel状态
  16. ENVI气溶胶反演相关示例教材
  17. STM32应用开发实践教程:基于 CAN 总线的多机通信应用开发
  18. TDK优化 模块化思想 阿里巴巴矢量库 css文件引入顺序 外边距塌陷
  19. (一)MATLAB规划
  20. 实习面试结束后的一些思考(已拿腾讯实习 offer)

热门文章

  1. Citrix 修复严重漏洞,可导致 XenMobile Server 遭接管
  2. 这个容器逃逸 exploit 获得首届年度谷歌云平台大奖10万美元
  3. java测试驱动开发(TDD)之《井字游戏》
  4. 浮动的三个特点很重要。
  5. 数据中心高速需求 推动光通信迈向100Gbps
  6. Ext3.4--布局
  7. nagios监控配置错误汇总
  8. Real Application Testing Database Replay、SPA的价格和介绍
  9. 《XNA游戏开发》简介
  10. Vue 2.0 + Vue Router + Vuex 后台管理系统的骨架