博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C++】jsoncpp的安装与使用
阅读量:4183 次
发布时间:2019-05-26

本文共 4959 字,大约阅读时间需要 16 分钟。

一、JSON的简单介绍

JSON(JavaScript Object Notation):JS对象表示法

是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言

json文件的文件类型是”.json”

语法规则:

  1. 数据在 名称/值对 中

    名称在双引号中,后面写一个冒号,然后是值
    值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(true/false)、数组(在[]中)、对象(在花括号中)、null,这些结构可以嵌套。

    eg.数组:{    "people":                [                 {
    "firstname":"jr","lastname":"smith"}, {
    "firstname":"palu","lastname":"george"} ]} 对象people包含两个对象的数组,每个对象是某人的姓和名,people[0].lastname返回smith
  2. 数据由逗号分隔

  3. 花括号保存对象

  4. 方括号保存数组

二、jsoncpp的安装与测试

安装:

  1. 下载jsoncpp源码
  2. 解压jsoncpp到/opt/json下
    tar -zvxf jsoncpp-src-0.5.0.tar.gz -C /opt/json
    3.下载完后阅读README,发现需要用Scons来构建,关于Scons的介绍参考:,那么就下载Scons吧
  3. 下载Scons
  4. 解压Scons到/opt/json下
    tar -zvxf scons-2.1.0.tar.gz -C /opt/json
  5. 进入scons-2.1.0目录下,执行以下命令
    sudo python setup.py install
  6. 进入jsoncpp-src-0.5.0 目录下,执行
    sudo scons platform=linux-gcc
  7. 将/jsoncpp-src-0.5.0/include/目录下的json文件夹拷贝到/usr/include/
  8. 将jsoncpp-src-0.5.0/libs/linux-gcc-4.9.1/目录下的libjson_linux-gcc-4.9.1_libmt.a 拷贝到/usr/local/lib/下,并为了方便使用,将其重命名为libjson.a

三、jsoncpp源码及函数接口的简单分析

装好之后。先来写个代码跑一下吧。

/*************************************************************************    > File Name: test.cpp    > Author: Tanswer_    > Mail: 98duxm@gmail.com    > Created Time: 2017年05月30日 星期二 11时50分09秒 ************************************************************************/#include 
#include
#include
#include
#include
using namespace std;int main(){ string test="{\"id\":1,\"name\":\"test\"}"; Json::Reader reader; Json::Value value; if(reader.parse(test,value)) {
if(!value["id"].isNull()) {
cout<
<

编译运行:

这里写图片描述


工作目录:

jsoncpp/           //工作目录|-- include        //头文件根目录|  |-- json       //json头文件,对应jsoncpp-src-0.5.0\include\json|-- src            //cpp源码文件根目录  |-- json       //jsoncpp源码文件,对应jsoncpp-src-0.5.0\src\lib_json  |-- main.cpp   //我们的主函数,调用jsoncpp的示例代码,对应于jsoncpp-src-0.5.0/src/jsontestrunner|-- makefile       //makefile

jsoncpp 中所有对象、类名都在namespace json中,#include<json/json.h>包含json.h即可

主要包含三种类:Value、Reader、Writer

  1. Json::Value类:可表示所有json支持的类型,如 int、string、object 等
  2. Json::Reader类:将json文件流或字符串解析到 Json::Value 中,主要使用 parse 函数
  3. Json::Writer类:将 Json::Value 转换为字符串流,是一个纯虚类,并不能直接使用,主要使用它的子类:Json::FastWriter—-输出不带格式的json、Json::StyledWriter—输出带格式的json、Json::StyledStreamWriter

Value

Json::Value 是jsoncpp中最基本、最重要的类,用于表示各种类型的对象。其中jsoncpp中的数组同JS一样,可以表示任意类型的值。

/*************************************************************************    > File Name: value.cpp    > Author: Tanswer_    > Mail: duxm@xiyoulinux.org    > Created Time: 2017年06月12日 星期一 19时02分57秒 ************************************************************************/#include 
#include
#include
#include
#include
#include
#include
using namespace std;int main(){ Json::Value temp; //临时对象 temp["name"] = "temp"; temp["age"] = 20; Json::Value root; //表示整个json对象 //插入一个key名为key_string,value为"value_string" root["key_string"] = "value_string"; //插入一个key名为key_int,value为12345 root["key_int"] = 12345; //插入一个key名为key_boolean,value为false root["key_boolean"] = false; //插入一个key名为key_double,value为12.345 root["key_double"] = 12.345; //插入一个key名为key_object,value为temp root["key_object"] = temp; /*插入一个key名为key_array, **是个数组,value为"value_string" 和 12345 */ root["key_array"].append("array_string"); root["key_array"].append(12345); /*转换为json格式的字符串*/ string out = root.toStyledString(); /*输出*/ cout << out << endl; return 0;}

运行结果:

这里写图片描述

也可以看到插入数据的顺序和在json对象中相反。以上基本满足大部分的使用了,当然还用其他用法。

Writer

查看json的内容,就用到Writer类。上面也提到了Json::Writer是个纯虚类,并不能直接使用,我们使用它的子类:Json::FastWriter、Json::StyledWriter和Json::StyledStreamWriter

  • Json::FastWriter–处理json最快的,无格式输出

    比如我们把上面例子用这种方式输出:

Json::FastWriter fast_writer;    cout << fast_writer.write(root) << endl;

我们可以看到是没有格式的:

这里写图片描述


  • Json::StyledWriter 格式化输出json

    上面也用到了,还有一种写法:

/*格式输出*/    Json::StyledWriter styled_writer;    cout << styled_writer.write(root) << endl;

这里写图片描述

Json::Reader

Json::Reader 是用来读取的,就是将 json 字符串转化为 Json::Value 对象的。

/*************************************************************************    > File Name: parsefromstring.cpp    > Author: Tanswer_    > Mail: duxm@xiyoulinux.org    > Created Time: 2017年06月12日 星期一 11时26分31秒 ************************************************************************/#include 
#include
#include
#include
#include
#include
#include
using namespace std;/*解析json字符串*/void parsefromstring(const string& str){ Json::Value root; Json::Reader reader; /*root中将包含json字符串str中所有元素*/ if(reader.parse(str,root)) { cout << "name: " << root["name"].asString() << endl; cout << "age: " << root["age"].asInt() << endl; cout << "number: " << root["number"].asString() << endl; }}int main(){ string str = " { \"name\":\"孟哥\",\"age\":88,\"number\":\"04150001\" } "; parsefromstring(str); return 0;}

运行结果为:

这里写图片描述

已经解析出json串。

你可能感兴趣的文章
各种IO模型,一篇打尽
查看>>
finalize() 原理
查看>>
Mysql 锁
查看>>
详解 MySql InnoDB 中意向锁的作用
查看>>
论 MySql InnoDB 如何通过插入意向锁控制并发插入
查看>>
详解 MySql InnoDB 中的三种行锁(记录锁、间隙锁与临键锁)
查看>>
Mysql 锁的测试
查看>>
BeanPostProcessor的五大接口
查看>>
promotion failed和concurrent mode failure
查看>>
垃圾回收器学习之Full GC和CMS GC的区别
查看>>
Java JUnit 单元测试小结
查看>>
volatile关键字解析
查看>>
nginx upstream failover 容错机制
查看>>
java中,创建子类对象时,父类对象会也被一起创建么?
查看>>
nginx配置 -- 让匹配路径不作为文件目录的一部分
查看>>
Redis为什么是单线程的?
查看>>
Treiber Stack介绍
查看>>
FutureTask源码解读
查看>>
Redis架构之防雪崩设计:网站不宕机背后的兵法
查看>>
使用BloomFilter布隆过滤器解决缓存击穿、垃圾邮件识别、集合判重
查看>>