精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
json类似XML的C版本,标记简单,节省存储,降低通信传输压力。不管是C#的WEBAPI,还是网络服务,比如SOAP,都会选择把内容转成json进行传输。json里要求属性名要带双引号,字符串值也要带双引号,数值值不用带双引号。
jsoncpp是C++的json读写库,它虽然开源的,但是功能强大,能满足项目开发要求。VC++里使用jsoncpp,导入库,包含头文件后就可以使用,主要是用Json::FastWriter类和Json::Value类。
最近项目里用jsoncpp生成json文本,这里提供些代码和注释供大家提高。
std::string DataToJson() { Json::FastWriter writerinfo; Json::Value writevalueinfo,w2; Json::Value arrayinfo; Json::Value jall; writevalueinfo["id"]=123; writevalueinfo["time"]="2017.08.30 00:00:00"; w2["id"]=234; w2["time"]="2018.08.30 00:00:00"; arrayinfo.append(writevalueinfo);//数组加一个项 arrayinfo.append(w2);//数组加另外一个项 Json::Value writedata; writedata["count"] = 1; writedata["name"] = "cpp"; jall["data"]=writedata;//属性是个对象 jall["array"]=arrayinfo;//属性是个数组,注意不能写成jall.append(arrayinfo),因为数据是放在属性里,不是放在对象里 jall["abc"]=1; //get((Json::ArrayIndex)0,v0);数组类型对象中获取一项 //removeIndex(0,&v0);数组类型对象中删除一项 std::string strEmail = writerinfo.write(jall); return strEmail; }
jsoncpp默认是用string的,不是wstring,所以[]里的属性名不能是UNICODE范畴的,否则编译错误。错误为:错误 34 error C2166: 左值指定 const 对象。如果头文件里使用了jsoncpp的类型,要在头文件里包含jsoncpp的头文件。
#include "json/config.h" #include "json/value.h" #include "json/writer.h" #include "json/json.h"
在jsoncpp代码里有不少throw抛出异常代码,这表明处理不好,就会有非法操作。下面列举一二:
在config.h里有些全局的宏,比如字符串类型的规定:
#define JSONCPP_STRING std::string
通过这里代码修改为wstring,理论上可以让它支持UNICODE形式,不过可能修改点比较多。
用jsoncpp还要进行字符转换,比较麻烦。
jsoncpp的Json::Value类的核心是个联合和类型,代码如下:
union ValueHolder { LargestInt int_; LargestUInt uint_; double real_; bool bool_; char* string_; // actually ptr to unsigned, followed by str, unless // !allocated_ ObjectValues* map_; } value_; ValueType type_ : 8;
如果理解MFC的变体变量类型COleVariant,对这样的形式也好掌握。根据类型来决定使用联合的成员,应对不同类型的值。