irpas技术客

c++json库(jsoncpp)简单使用(包含下载使用方法,中文错误解决方案)_picksan_c++ json库

irpas 2433

c++json库(jsoncpp)简单使用方法(含下载)


下载地址:jsoncpp的github仓库地址:open-source-parsers/jsoncpp: A C++ library for interacting with JSON. (github.com)
使用:最简单的一种使用方式,使用.h和.cpp文件和你的项目一起编译

怎么获取.h和.cpp呢?看以下操作

打开你下载的jsoncpp文件夹双击运行amalgamate.py文件(需要有python环境)

操作后,会生成一个dist的文件夹

里面就是我们需要的jsoncpp的源代码了,只有三个文件可以直接包含到项目中一起编译

这个源文件还是跨平台的,在windows下和linux下都可以使用

?


介绍json文件读写以及普通的文件读写 使用前的准备工作,包含头文件 #include <iostream> //读写io c++标准库 #include <fstream> //读写文件 c++标准库 #include <string> //字符串类 c++标准库 #include <sstream> //字符串流 c++标准库 #include "json/json.h" //jsoncpp的头文件 1.打开写文件 void writeFileFromString(const string& filename,const string& body) { ? ?ofstream ofile(filename); ? ?ofile<<body; ? ?ofile.close(); } 2.打开读文件 string readFileIntoString(const char * filename) { ? ?ifstream ifile(filename); ? ?if(!ifile.is_open()){ ? ? ? ?cerr<<"文件打开错误"; ? } ? ?ostringstream buf; ? ?string filestr; ? ?char ch; ? ?while(buf && ifile.get(ch)){ ? ? ? ?buf.put(ch); ? } ? ?filestr = buf.str(); ? ?return filestr; } 3.读json文件,创建json对象 Json::Value readJsonFile(const string & filename) { ? ?//1.打开文件 ? ?ifstream ifile; ? ?ifile.open(filename); ? ? //2.创建json读工厂对象 ? ?Json::CharReaderBuilder ReaderBuilder; ? ?ReaderBuilder["emitUTF8"] = true;//utf8支持,不加这句,utf8的中文字符会编程\uxxx ? ?//3.创建json对象,等会要返回这个对象 ? ?Json::Value root; ? ? ? ?//4.把文件转变为json对象,要用到上面的三个变量,数据写入root ? ?string strerr; ? ?bool ok = Json::parseFromStream(ReaderBuilder,ifile,&root,&strerr); ? ?if(!ok){ ? ? ? ?cerr<<"json解析错误"; ? } ? ?//5.返回存有数据的json,这个json对象已经能用了 ? ?return root; } 4.读string,创建json对象 Json::Value readJsonFromString(const string& mystr ) { ? ?//1.创建工厂对象 ? ?Json::CharReaderBuilder ReaderBuilder; ? ?ReaderBuilder["emitUTF8"] = true;//utf8支持,不加这句,utf8的中文字符会编程\uxxx ? ?//2.通过工厂对象创建 json阅读器对象 ? ?unique_ptr<Json::CharReader> charread(ReaderBuilder.newCharReader()); ? ?//3.创建json对象 ? ?Json::Value root; ? ?//4.把字符串转变为json对象,数据写入root ? ?string strerr; ? ?bool isok = charread->parse(mystr.c_str(),mystr.c_str()+mystr.size(),&root,&strerr); ? ?if(!isok || strerr.size() != 0){ ? ? ? ?cerr<<"json解析出错"; ? } ? ?//5.返回有数据的json对象,这个json对象已经能用了 ? ?return root; ? } 5.写json到文件 void writeJsonFile(const string & filename,const Json::Value & root){ ? ?//1.写json的工厂对象 ? ?Json::StreamWriterBuilder writebuild; ? ?writebuild["emitUTF8"] = true;//utf8支持,加这句,utf8的中文字符会编程\uxxx ? ?//2.把json对象转变为字符串 ? ?string document = Json::writeString(writebuild,root); ? ?//3.调用前面的写文件函数,写入文件 ? ?writeFileFromString(filename,document); } 6.json对象的使用 //使用一个已经有数据的json对象 Json::Value root; root = readJsonFile("checkjson.json"); //第一种使用方法get //使用get方法获取json对象的name的值,第二个参数是没有name时返回的值 string name = root.get("name","null").asString(); string phone_num = root.get("phone_number","null").asString(); string car_num = root.get("car_number","null").asString(); ? //第二种使用方法root["name"],可以多级root["name"]["body"] ? 7.jsoncpp使用过程中utf8中文变成\uxxx的乱码问题

解决方案:

使用json的工厂创建类时,给他加上["emitUTF8"]的属性

写和读时都需要

//1.写json的工厂对象 ? ?Json::StreamWriterBuilder writebuild; ? ?writebuild["emitUTF8"] = true;//utf8支持,加这句,utf8的中文字符会编程\uxxx //1.创建工厂对象 ? ?Json::CharReaderBuilder ReaderBuilder; ? ?ReaderBuilder["emitUTF8"] = true;//utf8支持,不加这句,utf8的中文字符会编程\uxxx

不过这个方法有一个小bug,直接把包含utf8中文字符的json对象转化为string,中文还是会变成\uxxx的乱码。

不过,获取具体属性值,比如root["name"]的值,和用我前面的读写json的方法,获取和写入中文是正常的。

cout<<"root:"<<root.toStyledString()<<endl; 8.其他

jsoncpp的其他使用方法可参考以下链接

参考链接::json简介及JsonCpp用法 - Tocy - 博客园 (cnblogs.com)


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #C #json库 #a #Library #for #interacting