Linux C++使用函数模板实现JSON数据快速和完整写入到文件

昨天在自己的CentOS7机器上编译了JSONCPP库,然后根据api写了下面这个简单的测试程序。代码涉及了文件流数据读取和写入、jsoncpp库的读写api的使用。整个处理流程是先读取一个json格式文件的内容,然后把这些内容分别用jsoncpp库的Json::FastWriter(快速写入)和Json::StyledWriter(完整写入)这两个方式写入到两个文件中,最后读取这两个文件并输出。

Linux C++使用函数模板实现JSON数据快速和完整写入到文件

一、测试程序

代码比较简单,通过函数模板实现了Json::FastWriter(快速写入)和Json::StyledWriter(完整写入)这两个方式写入。

main.cpp
/** 
 * @FileName    jsoncpp_basic_4.cpp
 * @Describe    A simple example for using function template to complete Json::FastWriter and Json::StyledWriter.
 * @Author      vfhky 2017-04-16 15:54 https://typecodes.com/cseries/templatejsoncpp2file1.html
 * @Compile 	g++ jsoncpp_basic_4.cpp -ljsoncpp -o jsoncpp_basic_4
 */
#include <iostream>
#include <fstream>
#include <json/json.h>
#include <stdlib.h>
using namespace std;


//读取json格式的文件
bool b_ReadJson( const string &s_file_path, Json::Value &j_root )
{
	bool b_result = true;
	
	Json::Features features = Json::Features::strictMode();
	Json::Reader j_reader( features );
	
	//打开文件流
	ifstream istream;
	istream.open( s_file_path.c_str(), ios::in | ios::binary );
	if( !istream.is_open() )
	{
		istream.close();
		return b_result;
	}
	
	//parse函数会返回bool值
	if( !j_reader.parse( istream, j_root ) )
	{
		istream.close();
		cout << "[" << __LINE__ << "]Fail to parse." << endl;
		return b_result;
	}
	
	istream.close();
	return b_result;
}


//使用函数模板来实现快速写入json数据到文件和写入完整json数据到文件这两种方式
template< class T >
bool b_WriteJson( const string &s_file_path, Json::Value &j_root, T &t_writer )
{
	bool b_result = true;
	
	string s_fwriter = t_writer.write( j_root );
	ofstream ostream;
	ostream.open( s_file_path.c_str(), ios::out | ios::binary );
	if( !ostream.is_open() )
	{
		ostream.close();
		return b_result;
	}
	
	ostream << s_fwriter;
	ostream.close();
	
	return b_result;
}


int main( int argc, char **argv )
{
	Json::Value j_root;
	
	//要读取的文件
	const string s_jon_reader = "JSONCPP_BASIC_2.json";
	//要快速写入的文件
	const string s_jon_fwriter = "JSONCPP_BASIC_4_1.json";
	//要以完整json格式写入的文件
	const string s_jon_swriter = "JSONCPP_BASIC_4_2.json";
	
	if( !b_ReadJson( s_jon_reader, j_root ) )
	{
		cout << "[" << __LINE__ << "]Fail b_ReadJson." << endl;
		return -1;
	}
	
	//快速写入json数据到文件
	Json::FastWriter j_fwriter;
	if( !b_WriteJson( s_jon_fwriter, j_root, j_fwriter ) )
	{
	   cout << "[" << __LINE__ << "]Fail b_WriteJson." << endl;
	   return -2;
	}
	
	//写入完整json数据到文件
	Json::StyledWriter j_swriter;
	if( !b_WriteJson( s_jon_swriter, j_root, j_swriter ) )
	{
	   cout << "[" << __LINE__ << "]Fail b_WriteJson." << endl;
	   return -3;
	}
	
	
	//先读取上面快速写入json数据到文件中的内容
	cout << "-----------------------" << s_jon_fwriter << "-----------------------" << endl;
	string s_cmd = "cat " + s_jon_fwriter;
	system( s_cmd.c_str() );
	
	//再读取上面完整json数据到文件中的内容(当然也可以使用system函数)
	cout << "\n-----------------------" << s_jon_swriter << "-----------------------" << endl;
	if( !b_ReadJson( s_jon_swriter, j_root ) )
	{
	   cout << "[" << __LINE__ << "]Fail to parse." << endl;
	   return -4;
	}
	cout << j_root << endl;
	
    return 0;
}

二、编译并执行

使用g++或者之前写的这个Makefile文件进行编译,执行结果如开头的图片所示。

Linux C++使用函数模板实现JSON数据快速和完整写入到文件

评论

评论加载中…