干it也有快3年了,一直在小公司,什么都要干,接触过很多技术,花时间学会了,将任务完成了,基本上也就放下了。从来没有认真写博客总结一下。现在痛下决心,决定好好将自己用到过的技术好好总结一些。
此篇博客是学习完json写的,json是一种标记语言,功能和xml相似,但是要比xml轻量级。从自己使用的经验来看,json将会慢慢被使用的越来越广泛。
很多语言都有现成的解析json的开源库,其中C++用来解析json的是jsoncpp。
下载网址:http://sourceforge.net/projects/jsoncpp/
使用方法有两个,可以将之编译成.Lib的静态库,或者直接将源文件加入到工程。我用的是编译成静态库,尽量减少主工程中的可见代码量。
方法一:使用Jsoncpp生成的lib文件
解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译,默认生成静态链接库。 在工程中引用,只需要包含include/json下的头文件及生成的.lib文件即可。
如何包含lib文件:在.cpp文件中#pragma comment(lib."json_vc71_libmt.lib"),在工程属性中Linker下Input中AdditionalDependencies写入lib文件名字(Release下为json_vc71_libmt.lib,Debug为json_vc71_libmtd.lib)
(建议最好在自己的软件开发平台下编译,我是在vc6.0下编译的,因为在2010下编译好后在vc6.0里不能用。自己建立一个C++静态库项目,将头文件和源文件里的非.cpp的文件加入到工程头文件,将.cpp文件加入到源文件中。可能会遇到几个编译错误,自己根据实际情况解决掉就好了。)
注意:Jsoncpp的lib工程编译选项要和VS工程中的编译选项保持一致。如lib文件工程编译选项为MT(或MTd),VS工程中也要选择MT(或MTd),否则会出现编译错误问题,debug和release下生成的lib文件名字不同,注意不要看错了,当成一个文件来使用(我就犯了这个错误)。
方法二:使用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中AdditionalInclude 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文本:
[{“log1”,”001”},{“log2”,”002”},{“log3”,”003”}]
char szJsonstr[1024];
CString cstrJsonStr;
GetDlgItemText(IDC_EDIT1,szJsonstr,1024);
cstrJsonStr= szJsonstr;
std::stringstrJString;
strJString= cstrJsonStr.GetBuffer(cstrJsonStr.GetLength());
Json::Reader JReader;
Json::Value JValue;
//if(JReader.parse(strJString,JValue))
if(JReader.parse(szJsonstr,JValue))
{
std::stringstrOut1;
//=JValue["log1"].asString();
//std::stringstrOut2 = JValue["log2"].asString();
for(int i=0; i<JValue.size(); i++)
{
strOut1= JValue[i]["log1"].asString();
intiii = 4;
}
}
Json字符串拼接:
Json::Valueroot;
Json::ValuearrayObj;
Json::Valueitem;
item["cpp"]="jsoncpp";
item["java"]="jasomjava";
item["php"]="support";
arrayObj.append(item);
Json::Valueitem2;
item2["cpp"]="jsoncpp";
item2["java"]="jasomjava";
item2["php"]="support";
arrayObj.append(item2);
root["namea"]= "json";
root["arraya"]= arrayObj;
std::stringitemstr = item.toStyledString();
std::stringlogstr = arrayObj.toStyledString();
std::stringlogAppendstr = root.toStyledString();
CStringcstrResult = itemstr.c_str();
cstrResult+= logstr.c_str();
cstrResult+= logAppendstr.c_str();
//GetDlgItem(IDC_EDIT1).
SetDlgItemText(IDC_EDIT1,cstrResult);
拼接结果:
Item拼接出来是这样的:
{
"cpp" : "jsoncpp",
"java" : "jasomjava",
"php" : "support"
}
arryObj拼接出来是这样的:
[
{
"cpp" : "jsoncpp",
"java" : "jasomjava",
"php" : "support"
},
{
"cpp" : "jsoncpp",
"java" : "jasomjava",
"php" : "support"
}
]
Root拼接出来是这样的:
{
"arraya" : [
{
"cpp" : "jsoncpp",
"java" : "jasomjava",
"php" : "support"
},
{
"cpp" : "jsoncpp",
"java" : "jasomjava",
"php" : "support"
}
],
"namea" : "json"
}
最后再说几句鼓励自己的话,做了C++三年,自己仔细想真的没有沉淀下来多少,对于代码项目组织的乱七八糟。原因就是自己没有认真总结,没有对学到的知识做到温故知新,既然要做这一行,就好好做,不能再得过且过,混日子了。对自己负责,如果连一个优秀的程序员、优秀的员工都做不到,创业就是扯淡。以后会根据实际情况,指定每周写一篇博客的计划,哪怕是一个小小的知识点。真正的努力,才会有好结果。加油!!