首先下载一个jsoncpp,然后解压,用vs2015编译。
在jsoncpp-src-0.5.0->makefiles->vs71文件夹下找到jsoncpp.sln文件,打开,有三个工程,对其中lib_json这个工程进行编译生成(可以生成两种库,debug库和release库,二者不同,工程debug的时候需要debug库,release时需要release库)。生成成功后会在jsoncpp-src-0.5.0->build->vs71->debug->lib_json文件夹下得到json_vc71_libmtd.lib文件
编译之后为
编译文件
然后打开Vs2015创建一个空的C++项目
右键工程名,选择在文件资源管理器中打开。
然后创建文件夹include,和lib
把jsoncpp-src-0.5.0\include里边内容复制到include文件夹中,把jsoncpp-src-0.5.0\build\vs71\debug\lib_json\json_vc71_libmtd.lib复制到lib文件夹中。
返回VS,在解决方案资源管理器里选择
这个,即可显示刚才创建,但是没有加入到项目里的文件 夹include,lib。VS2015 在项目中创建文件夹就是此方法,
显示值后为
右键这两个文件夹,选择包括在项目中。
然后配置一个工程属性,右键工程名,打开属性。
在工程属性页中添加include文件夹,以及引入lib文件
注:如果此时项目属性页没显示C/C++此时在源文件中新建一个main.cpp 不用写代码 ,创建即可。
选择项目里的include文件夹
应用。
然后添加附加库目录。
链接器常规附加库目录,选择lib文件夹。
最后添加lib文件
链接器输入附加依赖项,把lib文件名输入进去。
然后编写代码:
#include <iostream>
#include <fstream>
#include "json/json.h"
using namespace std;
int main()
{
///
/ json Value的新建及key的访问 ///
///
cout << "json Value的新建及key的访问" << endl;
// 新建Json::Value对象
Json::Value value1;
// 给字段赋值,key必须为string型
// 类似STL的map,访问一个不存在的字段时会自动新建一个字段
value1["name"] = "英语"; // string型
Json::Value value2;
value2["name"] = "语文"; // string型
value2["score"] = 80; // 整型
value2["right"] = true; // bool型
value2["percent"] = 12.34567890; // double型
value2["count"]; // 单纯的访问一个key,由于该key不存在,所以会新建,值的类型为Json::nullValue
// 新建Value对象
Json::Value valueArr;
valueArr["name"] = "json array"; // string型
valueArr["object"] = value1; // json::Value型
valueArr["array"].append("array_element_one"); // 访问key为"array",该key不存在,会新建,类型为Json::arrayValue,数组型,且把第一个元素赋值为string型"array element one"
valueArr["array"].append("array_element_two"); // 该key已存在,往后面增加元素,赋值为string型"array element two"
valueArr["array"].append(33333); // 该key已存在,往后面增加元素,赋值为整型33333
valueArr["array"].append(value2); // 该key已存在,往后面增加元素,赋值为json::Value型
// 计算其中字段的个数
cout << "size = " << valueArr.size() << endl;
// key的访问
// 访问字段"object"的值,访问一个key前,先预判是否有该key
if (valueArr.isMember("object"))
{
// 存在的话,再判断其value的类型是否是自己预期的,根据前面32行赋值代码可知:"object"的值是Json::Value类型
if (valueArr["object"].isObject())
{
// 转换成对应的类型
Json::Value object = valueArr["object"];
// 字段检测,取值,可以放在一行中,谨记:先检测是否存在,后判断类型
if (object.isMember("name") && object["name"].isString())
{
string name = object["name"].asString();
cout << "valueArr[object] key = name, value = " << name.c_str() << endl;
}
}
}
// 访问字段"array"的值
if (valueArr.isMember("array") && valueArr["array"].isArray()) // 根据前面33行赋值代码可知:"object"的值是Json::arrayValue类型的
{
// 注意:虽然类型为Json::arrayValue,也是转换为Json::Value类型的
Json::Value arrayObject = valueArr["array"];
// 得到其元素个数
int array_size = arrayObject.size();
// 根据类型,逐个输出元素
for (int i = 0; i<array_size; i++)
{
// 若是Json::Value型
if (arrayObject[i].isObject())
{
// 转换成对应的类型
Json::Value object = arrayObject[i];
// 字段检测,取值
if (object.isMember("score") && object["score"].isInt())
{
int score = object["score"].asInt();
cout << "valueArr[array][" << i << "]" << " key = score, value = " << score << endl;
}
// 字段检测,取值
if (object.isMember("percent") && object["percent"].isDouble())
{
double percent = object["percent"].asDouble();
cout << "valueArr[array][" << i << "]" << " key = percent, value = " << percent << endl;
}
}
// 若是string类型
if (arrayObject[i].isString())
{
cout << "valueArr[array][" << i << "] value is " << arrayObject[i].asString() << endl;
}
// 若是整型
if (arrayObject[i].isInt())
{
cout << "valueArr[array][" << i << "] value is " << arrayObject[i].asInt() << endl;
}
}
}
cout << "\n\n" << endl;
//
/ 把Json::Value转换成字符串 //
//
cout << "把Json::Value转换成字符串" << endl;
cout << valueArr.toStyledString() << endl;
cout << "\n\n" << endl;
//
/ 从字符串中解析出json::Value //
//
cout << "从字符串中解析出json::Value" << endl;
// 要解析的json字符串
std::string strValue = "{\"key1\":\"value1\",\"array\":[{\"key2\":\"value2\"},{\"key2\":999},{\"key2\":\"value4\"}]}";
// json对象
Json::Value value3;
// 开始解析json,解析后的json对象存储在value中,成功返回true
Json::Reader reader;
if (reader.parse(strValue, value3))
{
// 字段key1
if (value3.isMember("key1") && value3["key1"].isString())
{
cout << "value3[key1] = " << value3["key1"].asString() << endl;
}
// 字段array
if (value3.isMember("array") && value3["array"].isArray())
{
Json::Value valueArray = value3["array"];
for (int i = 0; i<valueArray.size(); i++)
{
if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isString())
{
cout << "value3[array][" << i << "].[key2] = " << valueArray[i]["key2"].asString() << endl;
}
if (valueArray[i].isObject() && valueArray[i].isMember("key2") && valueArray[i]["key2"].isInt())
{
cout << "value3[array][" << i << "].[key2] = " << valueArray[i]["key2"].asInt() << endl;
}
}
}
}
cout << "\n\n" << endl;
//
/// 把json::Value写入到文件中 //
//
cout << "把json::Value写入到文件中" << endl;
ofstream ofs;
ofs.open("test.json");
// 第一种办法:直接输出,带缩进,效果等同于第三种办法
//ofs << valueArr.toStyledString();
// 第二种办法:快速输出,没有格式
//Json::FastWriter fw;
//ofs<<fw.write(valueArr)<<endl;
// 第三种办法:缩进输出
Json::StyledWriter sw;
ofs << sw.write(valueArr) << endl;
ofs.close();
cout << "输出到文件完毕" << endl;
cout << "\n\n" << endl;
//
/// 从文件中读取json::Value //
//
cout << "从文件中读取到json:value" << endl;
ifstream ifs;
ifs.open("test.json");
Json::Value value4;
Json::Reader jsonReader;
if (jsonReader.parse(ifs, value4))
{
// 得到字段的个数
cout << "size = " << value4.size() << endl;
// 访问
if (valueArr.isMember("name") && valueArr["name"].isString())
{
cout << "valueArr[name] = " << valueArr["name"].asString() << endl;
}
}
getchar();
return 0;
}
ctrl+f5运行,显示结果为:
此结果表示
添加的第三方库编译时的运行库配置与使用此第三方库的项目的运行库配置不一致引起的。
即,第三方库编译是的运行库选项是“MTd_StaticDebug”,而当前项目中的值为“MDd_DynamicDebug”,因此解决问题的方法是修改当前项目的运行时配置。
右键项目,属性C/C++代码生成选择运行库改为多爱你城调试(/MTd)即可。
应用,确定。Ctrl+f5运行,
运行无误,完毕!