jsoncpp的使用

看了网上很多说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;
}

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值