在 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=$ 平台名
$ 平台名 可选为:
- suncc: Sun C++ (Solaris)
- vacpp: Visual Age C++ (AIX)
- mingw
- msvc6: Microsoft Visual Studio 6 service pack 5-6
- msvc70: Microsoft Visual Studio 2002
- msvc71: Microsoft Visual Studio 2003
- msvc80: Microsoft Visual Studio 2005
- msvc90: Microsoft Visual Studio 2008
- linux-gcc: Gnu C++ (linux, also reported to work for Mac OS X)
这样就会在
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;
}