irpas技术客

Linux下C++操作libjsoncpp_linux c++ 链接jsoncpp库_南来丶北往

irpas 5530

jsoncpp库编译

安装包

scons-2.5.0.tar.gz

Scons是一个以Python语言编码为基础的自动化构建工具,可用来替代make编写复杂的makefile。本次使用目的是为了编译jsoncpp

jsoncpp-src-0.5.0.gz

jsoncpp源代码包

安装步骤:(注原系统环境中如有scons的话请供参考,按本次操作完成后可能会影响python的环境)

cd /usr/local/ mkdri risen cd risen //将scons及jsoncpp安装包拷贝到risen文件夹 //解压scons安装包 tar -zxvf scons-2.5.0.tar.gz //解压jsoncpp安装包 tar -zxvf jsoncpp-src-0.5.0.gz 设置scons环境 export MYSCONS=/usr/local/risen/scons-2.5.0 export SCONS_LIB_DIR=$MYSCONS/engine //刷新环境 source /etc/profile cd jsoncpp-src-0.5.0 python $MYSCONS/script/scons platform=linux-gcc //把源码中的include/json文件夹拷贝到/usr/local/include目录下 cp /usr/local/risen/jsoncpp-src-0.5.0/include/json/ /usr/local/include/ -rf //把生成的json_linux-gcc-4.8.5_libmt.a和json_linux-gcc-4.8.5_libmt.so文件拷贝到/usr/local/lib目录下。 cp /usr/local/risen/jsoncpp-src-0.5.0/libs/linux-gcc-4.8.5/* /usr/local/lib/ -rf //在根目录下: vim /etc/ld.so.conf //在 /etc/ld.so.conf 下加入 /usr/local/lib 这一行,保存。 // 更新一下配置。 /sbin/ldconfig -v?

?vs2017配置jsoncpp

右键工程[属性]->[VC++目录]->[包含目录]中添加/usr/local/include,[库目录]添加/usr/local/lib/

C++操作jsoncpp

头文件CJson.h

#pragma once #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <malloc.h> #include <string.h> #include <memory.h> #include <sys/time.h> #include <sys/types.h> #include <sys/ioctl.h> #include <sys/stat.h> #include <fcntl.h> #include <math.h> #include "json/json.h" using namespace std; class CJson { public: CJson(); ~CJson(); //添加自己要格式化JSON或解析JSON的方法 }; json简介

JSON 指的是 JavaScript 对象表示法(JavaScript?Object?Notation)。

JSON的书写格式是key:value。

key表示的是名称,value是对应的值。value可以是null、布尔值、数字、字符串、数组、对象等。我们下面以一个人为对象建立json。下面简单列一下人的属性清单:

"人"属性清单 属性名称key内容类型备注姓名name老王字符串还是中文字符串当前年龄age29整形数值是个人了?person?true布尔型前女友数量ex-girlfriendnum0.5浮点数已经心死了,勉强算半个口袋里面的钞票moneynullnull...????????年龄趋势agetrend1.2.3...29数组家人?family父母...对象数组对象currentgirlfriend对象对象真的是对象

json value为null的表示方法:

{"money":null} //或 {"money":""}

json value为布尔值的表示方法:

{"person":true}

?json value为数字的表示方法:

{"age":29} //整形表示方法 {"ex-girlfriendnum":0.5} //浮点型表示方法

?json value为字符串的表示方法:

{"name":"老王"}

?json value为数组的表示方法:

{ "agetrend": [ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 ] }

?json value为对象的表示方法:

{ "currentgirlfriend": { "name":"老白", "age":18 } }

?json value为对象数组的表示方法:

{ "family": [ {"name":"老王头","age":52}, {"name":"老王头太太","age":53}, ] } 格式化json字符串 #pragma once #include "CJson.h" void main() { Json::FastWriter l_JsonStr; //将json转成字符串 Json::Value l_PersonWzx; int l_iAge = 29; l_PersonWzx["name"] = "老王"; //字符串 l_PersonWzx["age"] = l_iAge; //整形数值29 l_PersonWzx["person?"] = true; //布尔型 l_PersonWzx["ex-girlfriendnum"] = 0.5; //浮点型数值 l_PersonWzx["money"] = ""; //null for(int i=0;i<l_iAge;i++) l_PersonWzx["agetrend"].push_back(i+1); //数组 Json::Value l_Father; Json::Value l_Mother; Json::Value l_Girlfriend; l_Father["name"] = "老王头"; l_Father["age"] = 52; l_PersonWzx["family"].push_back(l_Father); l_Mother["name"] = "老王头太太"; l_Mother["age"] = 53; l_PersonWzx["family"].push_back(l_Mother); //对象数组 l_Girlfriend["name"] = "老白"; l_Girlfriend["age"] = 18; l_PersonWzx["currentgirlfriend"] = l_Girlfriend; cout << l_JsonStr.write(l_PersonWzx) << endl; return; }

由于中文编码的问题,"name"无法显示中文;?

使用高级隐藏技能,三种方法让中文显示出来。因为mobaXterm显示的时候使用的是utf-8的编码,c++代码我默认的是简体中文gb2312,中文乱码是因为编码不一致导致的。

方案一:将mobaXterm展示方式修改为gb2312;右键连接,点击编辑连接[Edit session],点击[Terminal settings]下面的[Terminal fonts settings],将编码显示GB2312,重新打开链接。

方案二:在vs2017,通过高级保存选项将代码的文件属性改成utf-8。随后重新编译即可。

方案三:使用iconv库将"name"对应的中文内容进行格式转换,将编码转换成utf-8后再存入"name"中重新编译即可。但在jsoncpp库内部对有些中文编码进行特殊处理过,因此需要修改jsoncpp底层的代码。

?执行成功后如下图:

?解析json字符串

计算机联网情况下网址输入:json.cn? ? 可以在线解析json字符串

解析字符串以下面JSON为对象进行解析:

{"age":29,"agetrend":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],"currentgirlfriend":{"age":18,"name":"老白"},"ex-girlfriendnum":0.50,"family":[{"age":52,"name":"老王头"},{"age":53,"name":"老王头太太"}],"money":"","name":"老王","person?":true}

struct Person { std::String m_sName; int m_iAge; }; struct PersonWzx { std::string m_sName; bool m_bperson; int m_iAge; float m_fEX_Girlfriendnum; std::string m_sMoney; std::vector<int> m_iAgeTrend; Person m_GirlFriend; std::vector<Person> m_Family; }; int main() { std::string l_str = "{\"age\":29,\"agetrend\":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],\"currentgirlfriend\":{\"age\":18,\"name\":\"老白\"},\"ex-girlfriendnum\":0.50,\"family\":[{\"age\":52,\"name\":\"老王头\"},{\"age\":53,\"name\":\"老王头太太\"}],\"money\":\"\",\"name\":\"老王\",\"person?\":true}"; Json::Reader reader; Json::Value l_PersonWzx; PersonWzx l_Wzx; if (reader.parse(l_str, l_PersonWzx)) { if (!l_PersonWzx["name"].isNull()) //判断key所对应的值是否为空 { l_Wzx.m_sName = l_PersonWzx["name"].asCString(); //以字符串形式提取 cout << "name :"<< l_Wzx.m_sName <<endl; } if (!l_PersonWzx["age"].isNull()) { l_Wzx.m_iAge = l_PersonWzx["age"].asInt(); //以整形方式提取 cout << "age :" << l_Wzx.m_iAge << endl; } if (!l_PersonWzx["person?"].isNull()) { l_Wzx.m_bperson = l_PersonWzx["person?"].asBool(); //以布尔型提取 cout << "person? :" << l_Wzx.m_bperson << endl; } if (!l_PersonWzx["ex-girlfriendnum"].isNull()) { l_Wzx.m_fEX_Girlfriendnum = (float)l_PersonWzx["ex-girlfriendnum"].asDouble(); //以浮点型提取 cout << "ex-girlfriendnum :" << l_Wzx.m_fEX_Girlfriendnum << endl; } if (!l_PersonWzx["money"].isNull()) { l_Wzx.m_sMoney = l_PersonWzx["money"].asCString(); cout << "money :" << l_Wzx.m_sMoney << endl; } if (!l_PersonWzx["agetrend"].isNull()) { for (int i = 0; i < l_PersonWzx["agetrend"].size(); i++) { int l_iAgeTemp = l_PersonWzx["agetrend"][i].asInt(); l_Wzx.m_iAgeTrend.push_back(l_iAgeTemp); cout << "agetrend Index:" << i <<"agetrend"<< l_iAgeTemp << endl; } } if (!l_PersonWzx["family"].isNull()) { for (int i = 0; i < l_PersonWzx["family"].size(); i++) { Person l_TempPerson; l_TempPerson.m_sName = l_PersonWzx["family"][i]["name"].asCString(); l_TempPerson.m_iAge = l_PersonWzx["family"][i]["age"].asInt(); l_Wzx.m_Family.push_back(l_TempPerson); cout << "family Index:" << i << "name" << l_TempPerson.m_sName << "age" << l_TempPerson.m_iAge << endl; } } l_Wzx.m_GirlFriend.m_sName = l_PersonWzx["currentgirlfriend"]["name"].asCString(); l_Wzx.m_GirlFriend.m_iAge = l_PersonWzx["currentgirlfriend"]["age"].asInt(); cout << "currentgirlfriend:" << "name" << l_Wzx.m_GirlFriend.m_sName << "age" << l_Wzx.m_GirlFriend.m_iAge << endl; } }

运行结果如下:

?以上是针对json的null、布尔值、数值、字符串、数组、对象、对象数组的构建与解析举例说明全部内容,欢迎交流讨论。


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

标签: #Linux #C #链接jsoncpp库