JSON 在C++中的使用(一)

2014-11-24 12:24:46 · 作者: · 浏览: 3

CppCMS的编译和使用
请参考我的相关文章。
C++对象转换成JSON字符串
假定有一个类response,两个字段,一个是status,0代表正确。其他代表错误。另一个是message字段,表示操作结果的具体信息。代码如下:

class response {
public:
//0 is ok
//other values are wrong
int status;
string message;
};

现在需要将response对象的数据转换成JSON格式字符串。还需要写一个模板类来,代码如下:

namespace cppcms {
namespace json {

template<>
struct traits {

static void set(value &v, response const& in) {
v.set("status", in.status);
v.set("message", in.message);
}
};

}
}

好,现在编写调用代码,并查看运行结果。

#include
...
int main(int argc, char** argv) {
response r1;
r1.status=0;
r1.message="ok";
cout<< cppcms::json::value(r1)<
response r2;
r2.status=1;
r2.message="unknown error";
cout<< cppcms::json::value(r2)< return 0;
}

运行结果:
{"message":"ok","status":0}
{"message":"unknown error","status":1}

cppcms::json::value类代码分析
之所以很容易就转换成JSON串,是因为使用了value类。现在来分析一下上面的调用代码里面是如何工作的。
1.cppcms::json::value(r1) 创建了匿名对象value,value的构造函数内部调用了set_value方法。参数v此时就是response对象。


template
value(T const &v)
{
set_value(v);
}

2.set_value方法调用了traits::set(this,v),这个就是前面我们重载的模板方法。

template
void set_value(T const &v)
{
traits::set(this,v);
}

3.剩下的事情目的很明确了,需要将value对象的值转换成JSON字符串,然后输出到流中。Artyom重载了operator<<函数,底层实现函数如下:

std::ostream &operator<<(std::ostream &out,value const &v)
{
v.save(out);
return out;
}

void value::save(std::ostream &out,int how) const
{
int tabs=(how & readable) 0 : -1;
write(out,tabs);
}

void value::write(std::ostream &out,int tabs) const
{
std::locale original(out.getloc());
out.imbue(std::locale("C"));
try {
write_value(out,tabs);
}
catch(...) {
out.imbue(original);
throw;
}
out.imbue(original);

}

void value::write_value(std::ostream &out,int tabs) const
{
switch(type()) {
case json::is_undefined:
throw bad_value_cast("Can't write undefined value to stream");
case json::is_null:
out<<"null";
break;
case json::is_number:
out<::digits10+1)< break;
case json::is_string:
out< break;
case json::is_boolean:
out<< (boolean() "true" : "false") ;
break;
case json::is_array:
{
json::array const &a=array();
unsigned i;
indent(out,'[',tabs);
for(i=0;i a[i].write_value(out,tabs);
i++;
if(i indent(out,',',tabs);
}