本文共 4959 字,大约阅读时间需要 16 分钟。
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
数据由逗号分隔
花括号保存对象
方括号保存数组
安装:
tar -zvxf jsoncpp-src-0.5.0.tar.gz -C /opt/json
3.下载完后阅读README,发现需要用Scons来构建,关于Scons的介绍参考:,那么就下载Scons吧tar -zvxf scons-2.1.0.tar.gz -C /opt/json
sudo python setup.py install
sudo scons platform=linux-gcc
装好之后。先来写个代码跑一下吧。
/************************************************************************* > 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
Json::Value
类:可表示所有json支持的类型,如 int、string、object 等Json::Reader
类:将json文件流或字符串解析到 Json::Value 中,主要使用 parse 函数Json::Writer
类:将 Json::Value 转换为字符串流,是一个纯虚类,并不能直接使用,主要使用它的子类:Json::FastWriter—-输出不带格式的json、Json::StyledWriter—输出带格式的json、Json::StyledStreamWriterJson::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对象中相反。以上基本满足大部分的使用了,当然还用其他用法。
查看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 字符串转化为 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串。