看了网上很多说jsoncpp的描述, 不是过长就是质量太低, 所以干脆自己来.本文意在用最短的代码描述jsoncpp的使用方式:
关键字:
jsoncpp
,无格式
,新旧api
一. jsoncpp新api
组织json数据
{
"string":"你好",
"array":["0","1"],
"subjson":{
"child":"childjson"
}
}
复制代码
std::string jsonStr;
Json::Value root, array, sub;
Json::StreamWriterBuilder writerBuilder;
std::ostringstream os;
root["string"] = "你好";
//数组
array[0] = "0";
array[1] = "1";
root["array"] = array;
//子串
sub["child"] = "childjson";
root["version"] = sub;
//1.json单行输出(无换行符), 去掉这句就会格式化输出
writerBuilder["indentation"] = "";
std::unique_ptr<Json::StreamWriter> jsonWriter(writerBuilder.newStreamWriter());
jsonWriter->write(root, &os);
jsonStr = os.str();
//2.清空os缓存, 这样可以服用jsonWriter继续导出json字符串
os.str("");
复制代码
解析
JSONCPP_STRING errs;
Json::Value root, array, sub;
Json::CharReaderBuilder readerBuilder;
// 这一步可以一步判断json格式是否合法
std::unique_ptr<Json::CharReader> const jsonReader(readerBuilder.newCharReader());
res = jsonReader->parse(sRecv.c_str(), sRecv.c_str() + sRecv.length(), &root, &errs);
if (!res || !errs.empty()) {
std::cout << "parseJson err. " << errs << std::endl;
return -1;
}
string tmp1 = root["string"].asString();
int n = root["array"].size();
for (int i = 0; i < n; i++)
{
string tmp2 = root["array"][i].asString();
}
复制代码
二. jsoncpp旧api
组织json数据
{
"string":"你好",
"array":["0","1"],
"subjson":{
"child":"childjson"
}
}
复制代码
组织数据都一样, 只是不需要用到 Json::StreamWriterBuilder
Json::Value root, array, sub;
//1. 代格式化输出
string sJson = root.toStyledString();
//2. 无格式化输出(单行)
// 输出无格式json字符串
Json::FastWriter writer;
string sJson = writer.write(root);
std::ostringstream os;
os << strWrite;
string sJson = os.str();
os.str("");
复制代码
老板接口解析和新的一样,区别就是判断json字符串合法性
解析json
string sJson;
Json::Reader read;
Json::Value value;
//1.判断是否是json格式
if(read.parse(sJson, value) != NULL)
{
//2.判断是否空对象
if (!value.isObject())
return ERROR;
}
复制代码