进行 http 或者是其他需要交互的请求时,常常用 JSON 用于中间数据的传输。由此,Apus IDE 对 json-c 进行了进一步封装,下面将详细讲解,如何生成/解析 JSON。
例如,我希望生成以下的 json 数据
{
"code": 200,
"result":"success"
}
可以通过 StringUtil 中的 mapToJson 方法,对于这种字段中的数字类型进行处理
#include "util/StringUtil.h"
map<string, string> map1;
map1["code"] = StringUtil::vertInt("200");
map1["result"] = "success";
string json = StringUtil::mapToJson(map1);
其中,vertInt
可以帮助转换值为数字类型的值。
如果全字段都为字符串类型(推荐使用这种结构),还可以按照下面这种方式进行构造
KV_Str_Str kvvvs;
kvvvs.k = "code";
kvvvs.v = "200";
kvsss.push_back(kvvvs);
kvvvs.k = "result";
kvvvs.v = "success";
kvsss.push_back(kvvvs);
string json = StringUtil::vectorToJsonc(kvsss);
如果我的 json 字符串比较复杂,如下面这种形式
{
"code":200,
"arr":[
{
"name":"wh",
"value": "武汉"
},
{
"name":"xtt",
"value":"鑫通态"
}
],
"result":"success"
}
关于code
和result
字段不做过多赘述,下面将讲解如何构造 arr 这个数组
#include "util/StringUtil.h"
#include "util/Util.h"
string json;
vector<vector<KV_Str_Str>> kvs;
vector<KV_Str_Str> kvss;
kvss.clear();
KV_Str_Str kv;
kv.k = "name",
kv.v = "wh",
kvss.push_back(kv);
kv.k = "value",
kv.v = "武汉",
kvss.push_back(kv);
kvs.push_back(kvss);
kvss.clear();
kv.k = "name",
kv.v = "xtt",
kvss.push_back(kv);
kv.k = "value",
kv.v = "鑫通态",
kvss.push_back(kv);
kvs.push_back(kvss);
Util::convertArrayToJson(kvs,json);
kvss.clear();
kv.k = "code";
kv.v = "200";
kvss.push_back(kv);
kv.k = "arr";
kv.v = json;
kvss.push_back(kv);
kv.k = "result";
kv.v = "success";
kvss.push_back(kv);
string rJson = StringUtil::vectorToJsonc(kvss);
如果 json 是这种简单类型,如下所示
{
"code": "200",
"result":"success"
}
#include "util/Util.h"
// 获取到了json串为strJson
string code = Util::getValFromJsonc(strJson, "code");
string content = Util::getValFromJsonc(strJson, "result");
{
"code":"200",
"arr":[
{
"name":"wh",
"value": "武汉"
},
{
"name":"xtt",
"value":"鑫通态"
}
],
"result":"success"
}
#include "util/Util.h"
string retCode = Util::getValFromJsonc(strJson, "code");
string retContent = Util::getValFromJsonc(strJson, "result");
string retArr = Util::getValFromJsonc(strJson, "arr");
vector<vector<KV_Str_Str>> kvss;
bool b = Util::getArrayFromJsonc(arr, kvss);
if (b){
// 这里仅取数组中的第一个元素 剩下的元素相同处理,可以通过for循环处理
vector<KV_Str_Str> kvssss = kvss[0];
string kvvvs = StringUtil::vectorToJsonc(kvssss);
string nm = Util::getValFromJsonc(kvvvs, "name");
string vl = Util::getValFromJsonc(kvvvs, "value");
}