ejson 轻量简单的 C++ JSON 解析库开源项目

我要开发同款
匿名用户2019年03月25日
159阅读

技术信息

开源地址
https://github.com/HuangHongkai/ejson
授权协议
未知

作品详情

介绍

该库为轻量级的c++jso解析与构造库,源码很短,适合学习,觉得不错的点个star。

提供了的功能:

jso字符串解析为c++对象(JSONArray和JSONObject)c++对象中获取key-value值c++对象转化为jso字符串

除此之外,由于jso支持了多种数据类型,还可以将JSONArray对象看成是pytho的list,JSONObject看成是pytho的dict,库中提供了方便操作的api函数。例如以下初始化方法,

JSONArrayarr={123.4,"dfsdf",23,ullptr};//类似于pytho的listJSONArrayarr2=LIST(1.23,"sdfsdg",234,ullptr);//提供一个LIST初始化宏,类似于pytho的listJSONObjectobj={{"testobj",{"key","value"}},{"itumber",2},{"floatumber",34.3},{"mystrig","fsdfsdg"},{"ullptr",ullptr},{"emptylist",{}},};//可以看成是pytho的dictJSONObjectobj2=OBJECT(KEYVALUE("userame","hhk"),KEYVALUE("obj",OBJECT(KEYVALUE("abcd",LIST(1,2.3,"hahahaha")),KEYVALUE("obj",OBJECT(KEYVALUE("key","thisisobj.obj.key'svalue"))))),KEYVALUE("ull",ullptr),KEYVALUE("list",LIST(1,"qwerty",2.34,OBJECT(KEYVALUE("key","thisisakey"),KEYVALUE("key2","thisisakey2"),))),);//提供了一个初始化宏,类似于pytho的dict//注:使用OBJECTLIST初始化宏的目的是为了替代{}来进行初始化,因为有时候大括号看起来会不够直观。

实现该库的一些技巧:

参考boostay.hpp,实现一个可以在容器里容纳任意类型的对象

typeid进行类型的判断

使用了很多递归方法

编译

编译依赖:

cmakegcc

如果是widows平台推荐使用cygwi套件(可以在widows下编译liux软件),配合clio,开发起来挺方便的。

例如widows平台下(liux下类似),编译静态库的方法如下,编译成功后在build目录下生成libSimpleJso.a静态库。

编译测试程序方法如下:(-lSimpleJso参数表示链接libSimpleJso.a静态库)

提供方便的API

这里Jso支持的类型有it,float,double,costchar*,strig,ullptr(cpp中的空指针)

JSONArray

使用[]操作符写入数据,可以使用cout直接打印输出

JSONArraytest1(2);//初始化分配大小,可以会自动拓展容量test1[0]=ullptr;test1[1]="thisiscostchar*";test1[2]=12324.5;test1[5]="中文字符串";cout<<test1<<edl;

初始化列表构造函数与链式操作

JSONArrayarr={123.4,"dfsdf",23,ullptr};//初始化列表arr[0]=12.314;arr[2]=2335;arr[3]="字符串";arr[6]=obj;//jso对象arr.add(123456)//整数.add(234.235236)//浮点数.add("字符串")//字符串.add(ullptr);//ull测试

get方法获取数值

例如 floatf=test1.get<float>(2); ,如果类型不正确的话会抛出异常

toStrig方法转换为字符串,toStrig可选参数,代表缩进的数量。

例如 test1.toStrig(4) 表示4空格缩进

JSONObject

使用[]来写入数据

//使用[]操作对象JSONObjecttest2;test2["float"]=123.456;test2["it"]=24;test2["strig"]="thisisastrig";test2["array"]=test1;test2["ullptr"]=ullptr;cout<<test2<<edl;

更加复杂的初始化方法

这种方法看起来比较直观,支持object和array的嵌套使用,这是我自己想出来的,有兴趣的朋友可以看下我的实现方法,讨论下有没有更加优秀的实现方式。

//obj初始化方法JSONObjectobj={{"testobj",{"key","value"}},{"itumber",2},{"floatumber",34.3},{"mystrig","fsdfsdg"},{"ullptr",ullptr},{"emptylist",{}},{"列表嵌套列表",{1,2.3,"sdf",{1,2.242,"float"}}},//列表嵌套{"列表嵌套对象和列表",{{{"key1",1234}},//被认为是对象{"key1",1234},//被认为是列表1.23,234325}},{"对象",{//所有的值都是{key,value}对则认为是嵌套对象{"aobj",1234566},{"bobj","bobjvalue"},}}};

这种方法有时候还是有点不够直观,所以我弄了一个宏,使得编写jso时更加直观

JSONObjectcotext=OBJECT(KEYVALUE("userame","hhk"),KEYVALUE("obj",OBJECT(KEYVALUE("abcd",LIST(1,2.3,"hahahaha")),KEYVALUE("obj",OBJECT(KEYVALUE("key","thisisobj.obj.key'svalue"))))),KEYVALUE("ull",ullptr),KEYVALUE("list",LIST(1,"qwerty",2.34,OBJECT(KEYVALUE("key","thisisakey"),KEYVALUE("key2","thisisakey2"),))),KEYVALUE("list1",LIST(1,2,3,4,5)),KEYVALUE("list2",LIST(1,2,3)),KEYVALUE("obj2",OBJECT(KEYVALUE("key1","value1"),KEYVALUE("key2",222),KEYVALUE("key3",333),)),KEYVALUE("a","111"),KEYVALUE("b","222"),KEYVALUE("c","333"),);

这里有三个宏,分别是OBJECT,KEYVALUE,LIST。

支持链式add的操作

obj["it"]=12325;obj["float"]=24235.235235;obj["strig"]="thisisastrig2";obj["ull"]=ullptr;obj.add("it",123)//整数.add("float",23.2324)//浮点数.add("strig","thisisastrig")//英文字符串.add("中文","这是中文字符串。。。")//中文字符串.add("symbols\",.[]@!#$%^","含有特殊符号\"")//特殊符号.add("list",{1,2.34,"eglishstrig",123.4,"中文字符串"})//列表.add("thisisull",ullptr)//ull测试.add("object",{{"key1","value1"},{"key2",223},{"key3",23.4}});//对象

get方法获取数值

例如, obj->get<strig>("strig") 可以获取到键为strig的值。

toStrig方法输出字符串,参数为缩进的数量

例如4空格缩进如下(obj.toStrig(4))

无缩进(obj.toStrig(-1))

无空格缩进( obj.toStrig(0))

字符串转换为jso对象

由于我们不知道字符串是array还是object,我们使用JSONBase类来接受返回的结果。

(JSONBase中有isJSONArray和isJSONArray方法,可以方便我们进行类型判断)

例如以下,

strigparse_str=R"({"ame":"hhk","key1":"valu\"e1","key2":[1,2,"asd",{"sadf":123,"sb":12.3},123.3]})";JSONBase*a=JSONBase::parse(parse_str);cout<<*a<<edl;JSONObject*b=dyamic_cast<JSONObject*>(a);//类型转换cout<<b->get<strig>("key1")<<edl;cout<<b->get<JSONArray>("key2").get<it>(1)<<edl;

parse方法用于不知道字符串是array还是object,parse_obj方法返回JSONObject,parse_arr方法返回JSONArray。(parse_obj,parse_arr用于明确知道字符串的类型)

如果字符串不是jso字符串,则抛出JSONParseExceptio异常。

功能介绍

介绍 该库为轻量级的c++ json解析与构造库,源码很短,适合学习,觉得不错的点个star。 提供了的功能: json字符串解析为c++对象(JSONArray和JSONObject) c++...

示例图片

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论