C++上Json的使用说明(从下载到生成库再到使用)
1、如何得到c++对应自己vs版本的json库文件
(1)下载json源码
本文选择一个第三方库 jsoncpp 来解析 JSON。jsoncpp 是比較出名的 C++ JSON 解析库。在 JSON官网也是首推的。下载地址为:http://sourceforge.net/projects/jsoncpp。本文使用的 jsoncpp 版本号为:0.5.0。下载得到jsoncpp-src-0.5.0.tar.gz压缩文件。
(2)编译生成静态库
下载的原工程并非对应的vs版本,因此需要使用本电脑的vs2015打开,重建工程如下。
可能会存在如下问题:
1)在对应目录中找不到lib_json.lib问题。输出路径问题,属性–》库管理器–》输出文件,修改对应名字即可。
(2)应该正确设置运行库模式,属性–》C/C++ --》代码生成 --》运行库–》选择 多线程调试(MTD)。
经过以上步骤,便可生成对应静态库lib_json.lib。
2、使用Json库实例
(1)建立工程引入头文件和json库
建立vs2015的c++工程,将包含头文件的json文件夹以及lib_json.lib库添加进工程如下:
(2)学习json的三个类及使用
jsoncpp 主要包括三种类型的 class:Value、Reader、Writer。jsoncpp 中全部对象、类名都在namespace Json 中,包括 json.h 就可以。
Json::Value 仅仅能处理 ANSI 类型的字符串,假设 C++ 程序是用 Unicode 编码的,最好加一个 Adapt类来适配。
具体应哟ing实例如下:
#include<iostream>
#include"json/json.h"
#include<assert.h>
using namespace std;
using namespace Json;
int main()
{
//1、Value的使用
Value json_temp; // 暂时对象,供例如以下代码使用
json_temp["name"] = Value("huchao");
json_temp["age"] = Value(26);
Value root; // 表示整个 json 对象
root["key_string"] = Value("value_string");
root["key_number"] = Value(12345);
root["key_boolean"] = Value(false);
root["key_double"] = Value(12.345);
root["key_object"] = json_temp;
root["key_array"].append("array_string");
root["key_array"].append(1234);
ValueType type = root.type();
cout << root["key_number"].asInt() << endl;
cout << root["key_object"]["name"].asCString() << endl;
cout << root["key_array"][(unsigned)0].asCString() << endl;
cout << "type :" << type << endl << endl;
//2、Writer的使用
FastWriter fast_writer;
cout << "Printf as FastWriter:" << endl;
cout << fast_writer.write(root) << endl<<endl;
StyledWriter styledwriter;
cout << "Printf as StyledWriter:" << endl;
cout << styledwriter.write(root) <<endl;
//3、Reader的使用
//(1)直接读取字符串char*
Reader reader;
Value json_object;
const char* json_document = "{\"age\:26,\"name\":\"huchao\"}";
if(!reader.parse(json_document, json_object))
return 0;
cout << json_object["name"] <<endl;
cout<<json_object["age"] <<endl;
//(2)、读取json文件
Reader reader1;
Value json_object1;
FILE* fp = fopen("test.json", "rb+");
if(NULL == fp)
{
cout<<"fopen failed"<<endl;
return -1;
}
fseek(fp, 0, SEEK_END);
int length = ftell(fp);
fseek(fp, 0, SEEK_SET);
char* buf = (char*)malloc(sizeof(char)*1024);
memset(buf, 0, 1024);
int ret = fread(buf, length, 1, fp);
/*
如果是:fread(buff, size, 1, fp)
返回1表示读取到了size字节,返回0表示读取数量不足size字节
*/
if(strlen(buf) == 0)
{
cout<<"file is empty"<<endl;
}
if(!reader1.parse(buf, json_object1))
{
cout<<"Convert failed"<<endl;
}
cout << json_object1["key_number"].asInit() << endl;
cout << json_object1["ke_object"]["name"].asCString() << endl;
system("pause");
return 0;
}