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

我要开发同款
匿名用户2019年03月25日
59阅读
开发技术C/C++
所属分类Web应用开发、JSON/BSON开发包
授权协议未知

作品详情

介绍

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

提供了的功能:

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

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

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

实现该库的一些技巧:

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

typeid进行类型的判断

使用了很多递归方法

编译

编译依赖:

cmakegcc

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

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

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

提供方便的API

这里Json支持的类型有int,float,double,constchar*,string,nullptr(cpp中的空指针)

JSONArray

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

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

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

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

get方法获取数值

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

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

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

JSONObject

使用[]来写入数据

//使用[]操作对象JSONObjecttest2;test2["float"]=123.456;test2["int"]=24;test2["string"]="thisisastring";test2["array"]=test1;test2["nullptr"]=nullptr;cout<<test2<<endl;

更加复杂的初始化方法

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

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

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

JSONObjectcontext=OBJECT(KEYVALUE("username","hhk"),KEYVALUE("obj",OBJECT(KEYVALUE("abcd",LIST(1,2.3,"hahahaha")),KEYVALUE("obj",OBJECT(KEYVALUE("key","thisisobj.obj.key'svalue"))))),KEYVALUE("null",nullptr),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["int"]=12325;obj["float"]=24235.235235;obj["string"]="thisisastring2";obj["null"]=nullptr;obj.add("int",123)//整数.add("float",23.2324)//浮点数.add("string","thisisastring")//英文字符串.add("中文","这是中文字符串。。。")//中文字符串.add("symbols\",.[]@!#$%^","含有特殊符号\"")//特殊符号.add("list",{1,2.34,"englishstring",123.4,"中文字符串"})//列表.add("thisisnull",nullptr)//null测试.add("object",{{"key1","value1"},{"key2",223},{"key3",23.4}});//对象

get方法获取数值

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

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

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

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

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

字符串转换为json对象

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

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

例如以下,

stringparse_str=R"({"name":"hhk","key1":"valu\"e1","key2":[1,2,"asd",{"sadf":123,"sb":12.3},123.3]})";JSONBase*a=JSONBase::parse(parse_str);cout<<*a<<endl;JSONObject*b=dynamic_cast<JSONObject*>(a);//类型转换cout<<b->get<string>("key1")<<endl;cout<<b->get<JSONArray>("key2").get<int>(1)<<endl;

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

如果字符串不是json字符串,则抛出JSONParseException异常。

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

评论