- 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 | 老王 | 字符串 | 还是中文字符串 |
当前年龄 | age | 29 | 整形数值 | |
是个人了? | person? | true | 布尔型 | |
前女友数量 | ex-girlfriendnum | 0.5 | 浮点数 | 已经心死了,勉强算半个 |
口袋里面的钞票 | money | null | null | ... |
年龄趋势 | agetrend | 1.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、布尔值、数值、字符串、数组、对象、对象数组的构建与解析举例说明全部内容,欢迎交流讨论。