using jsoncpp

在 cpp 中简单快速的对 json 文件进行 read 和 write, jsoncpp 的地址:jsoncpp
里面 readme 没有简单的介绍怎么使用,对于小白来说还是蛮折腾的:
README.md 里面介绍了两种(编译)安装方法:一种是使用 cmake, 另外一种是使用 scons.
先说使用 cmake:
git clone 源代码后,在源代码的目录下进行操作:

mkdir -p build/debug

cd build/debug

cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -G "Unix Makefiles" ../..

make

make install

不意外的话会把 json/*.h json/*.cpp 等头文件装到
/usr/local/include/

目录下,同时会成一个静态的库文件 libjsoncpp.a:

147:lib_json Jialin$ pwd
/Users/Jialin/gitOriginal/jsoncpp/build/src/lib_json
147:lib_json Jialin$ ls
CMakeFiles		CTestTestfile.cmake	Makefile
		cmake_install.cmake	libjsoncpp.a

把这 libjsoncpp.a 移动到
/usr/local/lib/

目录下。

测试编译准备好了的测试文件 main.cpp
g++ main.cpp -ljsoncpp

注意是 -ljsoncpp 而不是 -llibjsoncpp.a 或者 -llibjsoncpp
这样成功生成 a.out 说明已经成功使用了 jsoncpp
而使用 scons 要先安装 scons 这种软件,然后在源代码的目录下执行
scons platform=$ 平台名

$ 平台名 可选为:

这样就会在
libs/linux-gcc-4.8.2/

目录(这里的 linux-gcc-4.8.2 依据使用的 gcc 版而会不同)下生成 libjson_linux-gcc-4.8.2_libmt.a
这就 jsoncpp 的静态库文件,把这个文件移动到
/usr/local/lib/

目录下,以及把目录文件
src/json/

移动到
/usr/local/include

下即可
main.cpp 测试文件的内容也帖上来吧(网上找的)

#include <cstdio>
#include <iostream>
#include <cstring>
// This is the JSON header
#include <json/json.h>

using namespace std;

int main(int argc, char **argv)
{
 string json_example = "{\"array\": \
                            [\"item1\", \
                            \"item2\"], \
                            \"not an array\": \
                            \"asdf\" \
                         }";

 // Let's parse it
 Json::Value root;
 Json::Reader reader;
 bool parsedSuccess = reader.parse(json_example,
                                   root,
                                   false);

 if(not parsedSuccess)
 {
   // Report failures and their locations
   // in the document.
   cout<<"Failed to parse JSON"<<endl
       <<reader.getFormatedErrorMessages()
       <<endl;
   return 1;
 }

 // Let's extract the array contained
 // in the root object
 const Json::Value array = root["array"];

 // Iterate over sequence elements and
 // print its values
 for(unsigned int index=0; index<array.size();
     ++index)
 {
   cout<<"Element "
       <<index
       <<" in array: "
       <<array[index].asString()
       <<endl;
 }

 // Lets extract the not array element
 // contained in the root object and
 // print its value
 const Json::Value notAnArray =
               root["not an array"];

 if(not notAnArray.isNull())
 {
   cout<<"Not an array: "
       <<notAnArray.asString()
       <<endl;
 }

 // If we want to print JSON is as easy as doing:
 cout<<"Json Example pretty print: "
     <<endl<<root.toStyledString()
     <<endl;

 return 0;
}


通常都会涉及到 json 文本与文件的读写,下面是与文件相关的代码:

#include <iostream>
#include <json/json.h>
using namespace std;

const string fileName="./2config.json";
//it's better to return size of string that have been  push to file
bool writeFromString( const string &fileName, const string& buffer)
{
	size_t count=buffer.size();
	FILE *fd = fopen(fileName.c_str(),"wb+");
	if (fd == NULL)
	{
		cout<<"open file to write faild"<<endl;
		return 1;
	}
	const char*p = buffer.c_str();
	while (count > 0 ) {
		int num = fwrite(buffer.c_str(),sizeof(char),count,fd);
		if (num == -1) {
			printf("Fail to write from file");
			return false;
		}
		p += num;
		count -= num;
	}
	fclose(fd);
	return true;
}

int readToString(const string &fileName, string* str)
{
	*str = "";
	FILE *fd = fopen(fileName.c_str(),"rb");
	if (fd == NULL)
	{
		cout<<"can't open file: "<<*str<<endl;
		return 0;
	}
	char c;
	while((c = fgetc(fd)) != EOF){
		*str +=c;
	}
	fclose(fd);

	return (*str).length();

}

bool  jsonWriter(const string &fileName,const Json::Value &jsonValues){
	// write in a nice readible way
	Json::StyledWriter styledWriter;
	string tmpstr=styledWriter.write(jsonValues);
	// string tmpstr=Json::StyledWriter.write(fromScratch);
	return writeFromString(fileName,tmpstr);

}

bool  jsonReader(const string &fileName,Json::Value *jsonValues)
{
	string jsonMessage;
	readToString(fileName,&jsonMessage);
	Json::Value parsedFromString;
	Json::Reader reader;
	// // ---- parse from string ----
	bool parsingSuccessful = reader.parse(jsonMessage, parsedFromString);
	if (parsingSuccessful)
	{
		// cout<<parsedFromString["hello"]<<endl;
		// Json::StyledWriter styledWriter;
		// cout << styledWriter.write(parsedFromString) <<endl;
		*jsonValues=parsedFromString;
		return true;
	}
	return false;
}

int main(int argc, char *argv[])
{
	Json::Value jsonValues;

	jsonValues["demo"]="hahahahah";
	jsonWriter(fileName,jsonValues);

	if (jsonReader(fileName,&jsonValues))
	{
		cout<<jsonValues["demo"]<<endl;
	}
	return 0;
}

2015-05-12