锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / jsoncpp、jsoncpp开源、jsoncpp编译错误、jsoncpp非法操作和jsoncpp源代码分析
技术专题
jsoncpp入门技巧
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

jsoncpp、jsoncpp开源、jsoncpp编译错误、jsoncpp非法操作和jsoncpp源代码分析


json


json类似XML的C版本,标记简单,节省存储,降低通信传输压力。不管是C#的WEBAPI,还是网络服务,比如SOAP,都会选择把内容转成json进行传输。json里要求属性名要带双引号,字符串值也要带双引号,数值值不用带双引号。


jsoncpp

jsoncpp是C++的json读写库,它虽然开源的,但是功能强大,能满足项目开发要求。VC++里使用jsoncpp,导入库,包含头文件后就可以使用,主要是用Json::FastWriter类和Json::Value类。


jsoncpp开源

最近项目里用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;
}

json编译错误

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非法操作

在jsoncpp代码里有不少throw抛出异常代码,这表明处理不好,就会有非法操作。下面列举一二:

jsoncpp的LogicError非法操作
jsoncpp解析对象时LogicError非法操作

jsoncpp源代码分析

在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,对这样的形式也好掌握。根据类型来决定使用联合的成员,应对不同类型的值。

友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内