C++解析JSON(jsonCpp)
C++解析JSON(jsonCpp)
JSON(JavaScript Object Notation) 是⼀种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的⼀个⼦集。 JSON采⽤完全独⽴于语⾔的⽂本格式,但是也使⽤了类似于C语⾔家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语⾔。 易于⼈阅读和编写,同时也易于机器解析和⽣成(⽹络传输速度)
这⾥我们主要使⽤jsoncpp来解析json⽂件的
准备⼯作
下载jsonCpp
我们⾸先新建⼀个⽂件夹jsonCpp,然后将jsoncpp克隆到我们的⽂件夹下⾯:
>mkdir jsonCpp && cd jsonCpp
>git clone
现在你的⽂件夹下⾯就会有⼀个jsoncpp⽂件夹,这⾥⾯就是jsoncpp的源码
编译jsoncpp
⾯对这个多个⽂件和⽂件夹,是不是有点混乱了,但是我们⽤到的东西就只有两个⽂件夹,⼀个是src/lib_json⽂件夹,⼀个是include/json⽂件夹
于是新建⼀个⽬录,并将这两个⽂件夹复制出来,将json⽂件夹复制到lib_json⾥⾯
下载我们就需要编译这些⽂件,并⽣成静态链接库,其实不编译也⾏,只是后⾯⽤起来⽅便⼀点,我们来编辑⼀个Makefile
TARGET=libjson.lib
SRCS=json_writer.cpp\
json_reader.cpp\
json_value.cpp
OBJS=$(SRCS:.cpp=.o)
INCS=-I json
$(TARGET):$(OBJS)
ar rv $@ $^
%.o:%.cpp
g++ -c $< $(INCS) -o $@
make 以后发现报错了
显⽰错误为:
报错不到头⽂件
博主琢磨了⼀番,发现还是不到解决⽅案(对makefile不太熟悉,有⼤神指点⼀下么?),只有改源⽂件了了,于是将json_value.cpp,json_reader.cpp,json_write.cpp这三个⽂件⾥⾯的头⽂件的尖括号改为双引号,然后make编译成功。
读取JSON⽂件
我们得到了jsonCpp的静态链接库libjson.lib,接下⾯我们开始⽤jsoncpp解析json⽂件了
从上⾯的编译可知,jsoncpp⾥⾯⼤致包含三个类:
Json::Value ⽤来保存读取的数据或者将要写⼊⽂件的数据
Json::Reader ⽤来读取JSON⽂件⾥⾯的数据,并传⼊到Json::Value对象⾥⾯去
Json::FastWriter ⽤来将Json::Value对象写⼊到⼀个JSON⽂件中去
读取简单的JSON⽂件
using namespace std;
int main()
{
ifstream inFile("test.json", ios::in);
if(!inFile.is_open())
{
cerr<<"Open the file failed"<<endl;
return -1;
}
Json::Value root;
Json::Reader reader;
if(!reader.parse(inFile , root , false))
{
cerr<<"parse file failed"<<endl;
return -1;
}
cout<<"name : "<<root["name"].asString()<<endl;
cout<<"age : "<<root["age"].asInt()<<endl;
return -1;
}
test.json⾥⾯的数据为:
{
"name":"qeesung",
python怎么读取json文件"age":21
}
我们编译⼀下:g++ main.cpp libjson.lib -o myJson
运⾏结果为:
读取含有数组的JSON⽂件
using namespace std;
int main()
{
ifstream inFile("test.json", ios::in);
if(!inFile.is_open())
{
cerr<<"Open the file failed"<<endl;
return -1;
}
Json::Value root;
Json::Reader reader;
if(!reader.parse(inFile , root , false))
{
cerr<<"parse file failed"<<endl;
return -1;
}
for(int i = 0 ; i<root.size(); ++i)
{
cout<<"name : "<<root[i]["name"].asString()<<endl;
cout<<"age : "<<root[i]["age"].asInt()<<endl;
}
return -1;
}
json⽂件为:
[
{"name":"qeesung1","age":21},
{"name":"qeesung2","age":22},
{"name":"qeesung3","age":23},
{"name":"qeesung4","age":24}
]
编译运⾏结果为:
写⼊数据到SON⽂件中

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。