从使用开始说起。
从官网上下载一个jsoncpp的压缩包,我下载的是jsoncpp-src-0.5.0.tar.gz 下载地址:http://sourceforge.net/projects/jsoncpp/
直接解压,我用到vs2010,选择打开‘’项目/解决方案‘’,选择解压后的
jsoncpp-src-0.5.0\makefiles\vs71\jsoncpp.sln ,
1、打开后编译,生成静态链接库
(生成到链接库路径:jsoncpp-src-0.5.0\build\vs71\debug\lib_json\json_vc71_libmtd.lib-------------------------
<Release下为json_vc71_libmt.lib,Debug为json_vc71_libmtd.lib>----------------)。
注意!! 打开json工程,编译前,右键-->属性-->C/C++-->代码生成-->运行库 查询此选择的属性 和你的工程属性是否相同,需要保持一致才可以
2、json_vc71_libmtd.lib将其复制到vs工程的的lib里(即直接复制到项目中)。
在.cpp文件中增加 #pragma comment(lib,"json_vc71_libmtd.lib") ,
包含一下json.h 等相关头文件(按需来),直接从jsoncpp-src-0.5.0\include\json下复制到项目到头文件的文件夹中,再include一下
在工程属性中链接器->输入->附加依赖项填入这个lib的名字 json_vc71_libmtd.lib
(如果遇到一些引用到问题,可以看这个https://mp.csdn.net/postedit/103202396)
网上还有另外一种方法,没验证过,仅供参考::
方法二:使用Jsoncpp包中的.cpp和.h文件
解压上面下载的Jsoncpp文件,把jsoncpp-src-0.5.0文件拷贝到工程目录下,将jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\include\json和jsoncpp-src-0.5.0\jsoncpp-src-0.5.0\src\lib_json目录里的文件包含到VS工程中,在VS工程的属性C/C++下General中Additional Include Directories包含头文件目录.\jsoncpp-src-0.5.0\include。在使用的cpp文件中包含json头文件即可,如:#include "json/json.h"。将json_reader.cpp、json_value.cpp和json_writer.cpp三个文件的Precompiled Header属性设置为Not Using Precompiled Headers,否则编译会出现错误。
json用法:
解析字符串
CString strResponse;//从服务器拿回的数据
char *pmsg = strResponse.GetBuffer(strResponse.GetLength());
Json::Reader reader;
Json::Value root;
if (reader.parse(pmsg, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
{
std::string key = root["key"].asString(); // 访问节点 ;
std::string key2 = root["key2"].asString(); // 访问节点 ;
MessageBox((key + string(" ") + key2).c_str() );
}
还有网络上另外几种用法
解析json文件
int ReadJsonFromFile(const char* filename)
{
Json::Reader reader;// 解析json用Json::Reader
Json::Value root; // Json::Value是一种很重要的类型,可以代表任意类型。如int, string, object, array
std::ifstream is;
is.open (filename, std::ios::binary );
if (reader.parse(is, root, FALSE))
{
std::string code;
if (!root["files"].isNull()) // 访问节点,Access an object value by name, create a null member if it does not exist.
code = root["uploadid"].asString();
code = root.get("uploadid", "null").asString();// 访问节点,Return the member named key if it exist, defaultValue otherwise.
int file_size = root["files"].size(); // 得到"files"的数组个数
for(int i = 0; i < file_size; ++i) // 遍历数组
{
Json::Value val_image = root["files"][i]["images"];
int image_size = val_image.size();
for(int j = 0; j < image_size; ++j)
{
std::string type = val_image[j]["type"].asString();
std::string url = val_image[j]["url"].asString();
printf("type : %s, url : %s \n", type.c_str(), url.c_str());
}
}
}
is.close();
return 0;
}