一、JSON的简单介绍
JSON(JavaScript Object Notation):JS对象表示法
是轻量级的文本数据交换格式;独立于语言,JSON解析器和库支持多种编程语言
json文件的文件类型是”.json”
语法规则:
数据在 名称/值对 中
名称在双引号中,后面写一个冒号,然后是值
值可以是:数字(整数或者浮点数)、string(在双引号中)、逻辑值(true/false)、数组(在[]中)、对象(在花括号中)、null,这些结构可以嵌套。eg.数组: { "people": [ {"firstname":"jr","lastname":"smith"}, {"firstname":"palu","lastname":"george"} ] } 对象people包含两个对象的数组,每个对象是某人的姓和名,people[0].lastname返回smith
数据由逗号分隔
花括号保存对象
方括号保存数组
二、jsoncpp的安装与测试
安装:
- 下载jsoncpp源码
http://sourceforge.net/projects/jsoncpp/files/ - 解压jsoncpp到/opt/json下
tar -zvxf jsoncpp-src-0.5.0.tar.gz -C /opt/json
3.下载完后阅读README,发现需要用Scons来构建,关于Scons的介绍参考:http://os.51cto.com/art/201104/257443.htm,那么就下载Scons吧 - 下载Scons
http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download - 解压Scons到/opt/json下
tar -zvxf scons-2.1.0.tar.gz -C /opt/json
- 进入scons-2.1.0目录下,执行以下命令
sudo python setup.py install
- 进入jsoncpp-src-0.5.0 目录下,执行
sudo scons platform=linux-gcc
- 将/jsoncpp-src-0.5.0/include/目录下的json文件夹拷贝到/usr/include/
- 将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 <iostream>
#include <string>
#include <stack>
#include <algorithm>
#include <json/json.h>
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<<value["id"].asInt()<<endl;
cout<<value["name"].asString()<<endl;
}
}
return 0;
}
编译运行:
工作目录:
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
Json::Value
类:可表示所有json支持的类型,如 int、string、object 等Json::Reader
类:将json文件流或字符串解析到 Json::Value 中,主要使用 parse 函数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 <iostream>
#include <string>
#include <stack>
#include <queue>
#include <algorithm>
#include <vector>
#include <json/json.h>
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 <iostream>
#include <string>
#include <stack>
#include <queue>
#include <algorithm>
#include <vector>
#include <json/json.h>
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串。