JsonCpp库使用

Jsoncpp库使用

简介

JSON(JavaScript Object Notation)是一个轻量级的数据交互格式。它可以表示整数、实数、字符串、有序的值序列和名称/值对的集合。

下面是JSON数据的一个示例:

// Configuration options

{

// Default encoding for text

"encoding" : "UTF-8",

// Plug-ins loaded at start-up

"plug-ins" : [

"python",

"c++",

"ruby"

],

// Tab indent size

"indent" : { "length" : 3, "use_space": true }

}

特征

l 读取和写入JSON文档;

l 在解析期间关联C和C++风格的注释到元素;

l 重写JSON文档保留原始的注释。

注:JSON中通常是支持注释的,但是为了可移植性最好删除这些注释(C注释在Python中不支持)。因为注释在配置和输入文件中是有用的,所以保留了这个特征。

代码示例

Json::Value root; // will contains the root value after parsing.
Json::Reader reader;
bool parsingSuccessful = reader.parse( config_doc, root );
if ( !parsingSuccessful )
{
 // report to the user the failure and their locations in the document.
 std::cout << "Failed to parse configuration\n"
 << reader.getFormattedErrorMessages();
 return;
}
 
 
// Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
// such member.
std::string encoding = root.get("encoding", "UTF-8" ).asString();
// Get the value of the member of root named 'encoding', return a 'null' value if
// there is no such member.
const Json::Value plugins = root["plug-ins"];
for ( int index = 0; index < plugins.size(); ++index ) // Iterates over the sequence elements.
 loadPlugIn( plugins[index].asString() );
 
setIndentLength( root["indent"].get("length", 3).asInt() );
setIndentUseSpace( root["indent"].get("use_space", true).asBool() );
 
 
// ...
// At application shutdown to make the new configuration document:
// Since Json::Value has implicit constructor for all value types, it is not
// necessary to explicitly construct the Json::Value object:
root["encoding"] = getCurrentEncoding();
root["indent"]["length"] = getCurrentIndentLength();
root["indent"]["use_space"] = getCurrentIndentUseSpace();
 
 
Json::StyledWriter writer;
// Make a new JSON document for the configuration. Preserve original comments.
std::string outputConfig = writer.write( root );
 
 
// You can also use streams. This will put the contents of any JSON
// stream at a particular sub-value, if you'd like.
std::cin >> root["subtree"];
 
 
// And you can write to a stream, using the StyledWriter automatically.
std::cout << root;

编译指令

编译指令位于项目根目录下的README.txt文件中。

JsonCpp是一个简单的API,用于控制JSON的值,处理序列化和反序列化为字符串。JsonCpp使用Scons(http://www.scons.org)作为编译系统,它要求安装python环境(http://www.python.org)。

你需要从下面的URL中下载scons-local发行版:

http://sourceforge.net/projects/scons/files/scons-local/1.2.0/

解压缩该压缩文件到目录中,你可以找到README文件。Scons.py应该在与README文件同一级的目录下,然后执行下面的语句:

# python scons.py platform=PLTFRM [TARGET]

其中 PLTFRM可能是下面的一个平台:

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)

注意:如果你使用VS2008进行编译,在运行scons前你需要通过运行vcvars32.bat设置环境变量(例如:MSVC 2008命令提示符)。

增加平台相当的简单,你需要改变Sconstruct文件来实现。

TARGET可能是check: 编译库并且运行单元测试。

产生单个源文件和头文件:

JsonCpp提供一个脚本来产生单个的头文件和单个源文件,这样容易包含到现有的项目中。合并的源代码可以在任何时候生成,在根目录下运行下面的命令:

# python amalgamate.py

他可能需要指定头文件的名称,参见-h选项。缺省的情况下,产生下面的这些文件:

- dist/jsoncpp.cpp:需要添加到你项目中的源文件;

- dist/json/json.h:在项目中使用的头文件,他等价于没有合并源代码之前的json/json.h。该头文件只依赖于标准头文件

- dist/json/json-forwards.h:提供所有JsonCpp类型的向前声明。通常它需要包括在项目中以便加速编译。

版本控制中的最新版本文件的永久链接如下:

http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/README.txt?view=markup

下载

从SourceForge网站上可以下载到源代码,网址为:

http://sourceforge.net/projects/jsoncpp/files/

在项目的版本控制仓库中有最新的源代码版本可用,网址为:

http://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/trunk/

检出源代码,参见下面的说明文档:http://sourceforge.net/scm/?type=svn&group_id=144446

更新的内容

最新更改的描述可以在项目根目录下的NEWS.txt中找到。

在版本控制中最新版本的文件的永久链接为:

http://svn.sourceforge.net/viewcvs.cgi/jsoncpp/README.txt?view=markup

项目链接

Json-cpp主页:http://jsoncpp.sourceforge.net/

Json-cpp Sourceforge项目:http://www.sourceforge.net/projects/jsoncpp/

相关链接

l JSON说明书和可选的语言实现:http://www.json.org/

l YAML一种为人类可读而设计的数据格式:http://www.yaml.org/

l UTF-8和Unicode FAQ:http://www.cl.cam.ac.uk/~mgk25/unicode.html

许可

参见项目根目录下的LICENSE文件

基本上,JsonCpp在MIT许可或者在你的司法权下认可和希望的公共领域下使用。

你可能感兴趣的:(json)