Visual Studio 2017是微软于2017年3月8日正式推出的新版本,是迄今为止最具生产力的Visual Studio版本。其内建工具整合了NET Core、Azure应用程序、微服务(microservices)、Docker容器等所有内容。JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择
JSON的全称为:JavaScript Object Notation ,顾名思义,JSON是用于标记javascript对象的,详情参考
。
选择第三方库JsonCpp来解析json,JsonCpp是比较出名的c++解析库,在json官网也是首推的。
JsonCpp简介
JsonCpp主要包含三种类型的class:Value Reader Writer。
jsoncpp中所有对象、类名都在namespace json中,包含jsonh即可。
注意: Json::Value只能处理ANSI类型的字符串,如果C++程序使用Unicode编码的,最好加一个Adapt类来适配。
下载和编译
本文运行环境是: Redhat 55 + g++version 461 + GNU Make 381 + jsoncpp-050
下载地址是:
解压之后得到jsoncpp-src-050文件夹,我们只需要jsoncpp的头文件和cpp文件,其中jsonscpp的头文件位于jsoncpp-src-050includejson,jsoncpp的cpp文件位于jsoncpp-src-050srclib_json。
这里我列出我们的工作目录:
jsoncpp/ //工作目录
|-- include //头文件根目录
||-- json //json头文件,对应jsoncpp-src-050includejson
|-- src //cpp源码文件根目录
|-- json //jsoncpp源码文件,对应jsoncpp-src-050srclib_json
|-- maincpp //我们的主函数,调用jsoncpp的示例代码
|-- makefile //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践
反序列化Json对象
假设有一个json对象如下:
{ "name": "json″, "array": [ { "cpp": "jsoncpp" }, { "java": "jsoninjava" }, { "php": "support" } ] }
我们要实现这个json的反序列号代码如下:
voidreadJson() { usingnamespacestd; std::stringstrValue = "{\"name\":\"json\",\"array\":[{\"cpp\":\"jsoncpp\"},{\"java\":\"jsoninjava\"},{\"php\":\"support\"}]}"; Json::Reader reader; Json::Value value; if(readerparse(strValue, value)) { std::stringout= value["name"]asString(); std::cout <<out<<std::endl; constJson::Value arrayObj = value["array"]; for(unsigned inti = 0;i <arrayObjsize(); i++) { if(!arrayObj[i]isMember("cpp")) continue; out= arrayObj[i]["cpp"]asString(); std::cout <<out; if(i != (arrayObjsize() - 1)) std::cout <<std::endl; } } }
序列化Json对象
voidwriteJson() { usingnamespacestd; Json::Value root; Json::Value arrayObj; Json::Value item; item["cpp"] = "jsoncpp"; item["java"] = "jsoninjava"; item["php"] = "support"; arrayObjappend(item); root["name"] = "json"; root["array"] = arrayObj; roottoStyledString(); std::stringout= roottoStyledString(); std::cout <<out<<std::endl; }//判断map1中的key时候出现在map2中,出现的存入list集合中 List list = new ArrayList(); Map map1 = new HashMap(); Map map2 = new HashMap(); Set set1 =map1keySet(); Iterator it = set1iterator(); while(ithasNext()){ Object obj = i优点: 这个库使用了大量的C++ 11标准元素,另外库的设计上,也符合STL的一些标准,可配置性比较强;单文件方式,引用也比较方便;使用上,也有其独到的地方,更接近JSON的本质;此外性能上还是不错的,只是比rapidjson差,比libjson,jsoncpp之流还是强了不少
缺点: 不支持VS2013,并且看作者的意思,他也不会去兼容VS2013,但作为一个Win7统治桌面 *** 作系统的时代,VS2013一定会是一个主流的编译器,这一点说不过去;代码上,Morden C++的大量使用,对于一般的程序员来说,太不友好了;性能,好吧,他的确比rapidjson慢了5~10倍。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)