jsoncpp的安装和使用
1.jsoncpp安装
1.获取源码
https://github.com/open-source-parsers/jsoncpp
Jsoncpp
2.编译方式
- 静态库编译
mkdir build && cd build && cmake .. make sudo make install
在项目中新建include和lib,分别存放json头文件和libjsoncpp.a静态库
g++编译指令
g++ *.cpp -I ./lib -ljsoncpp -o test
- 源码调用
直接使用json.h和jsoncpp.cpp文件在项目中编译,将jsoncpp.cpp直接放到项目根目录下一同编译
g++ *.cpp -o test
2.jsoncpp的使用
- jsoncpp添加,删除,修改代码实现
#include<iostream>
#include<string>
#include<fstream>
#include"json/json.h"
using namespace std;
void parserJson(const string file_path)
{
// 打开json文件
ifstream ifp(file_path,ios::binary);
if(!ifp.is_open())
{
printf("OPEN ERROR\n");
return;
}
// 调用jsoncpp API 解析json文件
Json::Value value;
Json::Reader reader;
// Json流写入API
Json::StreamWriterBuilder writerBuilder;
std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
if(!reader.parse(ifp,value,false))
{
printf("parser failed!\n");
return;
}
// 打印信息
cout<<"Json-none:\n"<<value<<endl; // 无格式输出
cout<<"Json-format:\n"<<value.toStyledString()<<endl; // 带格式输出
// isMember查看json是否存在key
if(!value["table"])
{
printf("file is empty\n");
return;
}
// 获取成员
auto tables = value["table"];
int table_num = value["table_num"].asInt();
// 迭代解析table
for(int n=0;n<tables.size();n++)
{
int table_id = tables[n]["table_id"].asInt();
int ItemSize = tables[n]["ItemSize"].asInt();
auto Items = tables[n]["item"]; // Items为二维列表结构,单独解析
printf("Items.size = %d \n",Items.size());
for(int i=0;i<Items.size();i++)
{
auto Item = Items[i];
// 修改某一Item项,使其值均为0
if(i==1)
{
for(int j=0;j<Item.size();j++)
Item[j]=0;
// 导入原table流中
tables[n]["item"][i] = Item;
}
// 删除某一Item项
if(i==2)
{
// 创建新的Item覆盖原有Item项
Json::Value newtable;
for(int i=0;i<Items.size();i++)
{
if(i==2)
continue;
newtable.append(tables[n]["item"][i]);
}
tables[n]["item"] = newtable;
}
// 增加Item项
if(i==Items.size()-1)
{
for(int j=0;j<Item.size();j++)
{
tables[n]["item"][i+1][j]=1;
}
}
}
}
// 更新表项
value["table"] = tables;
// 打印信息
cout<<"new-Json-none:\n"<<value<<endl; // 无格式输出
cout<<"new-Json-format:\n"<<value.toStyledString()<<endl; // 带格式输出
ifp.close();
// 写入表项
std::ofstream ofp(file_path, std::ios::out);
jsonWriter->write(value, &ofp);
ofp.close();
}
int main(int argc,char** argv)
{
if(argv[1]!=NULL)
parserJson(argv[1]);
else
parserJson("myTable.json");
return 0;
}
// myTable.json如下
{
"table" :
[
{
"ItemSize" : 8,
"item" :
[
[
255,
255,
0,
1,
3,
4,
5,
6
],
[
0,
0,
0,
0,
0,
0,
0,
0
]
],
"table_id" : 255
},
{
"ItemSize" : 24,
"item" :
[
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
]
],
"table_id" : 2
}
],
"table_num" : 2
}