json格式的解析不需要自己进行编码实现,已经有好多稳定的开源库可供使用;c++可以使用jsoncpp,c可以使用cjson
JsonCpp是一个开源库
下载地址:https://github.com/open-source-parsers/jsoncpp
文档地址:http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
json数据格式有{} [] : " , 几种符号组成,如下:
键值对 “key”:value (说明:value可是数值 --》 “age”:18,也可以是字符串“string”--》“name”:“lilei”);
对象:一对{}即为一个对象,{}内可以是键值对的集合,也可以是数组[ ]
数组:一对[ ]既是一个数组,其概念类似于C语言中的数组,数组内可以是对象,也可以是键值对
下面是一个简单的例子,涵盖键值对,数组,对象
{
"task":"persional-message-deal",
"persional-msg":{
"head-teacher":{
"name":"hangmeimei",
"sex":"female",
"age":28,
"hight":49.8
},
"students-msgs":[
{
"name":"xiaoming",
"sex":"male",
"age":12,
"math-scores":90,
"english-scores":110
}, {
"name":"xiaohong",
"sex":"female",
"age":12,
"math-scores":90,
"english-scores":110
}
]
}
}
解析:
jsoncpp中两类 Value(json数据的存储,数据序列化和反序列化的方法),Reader(在字符串中对json数据的读取)
重点:在处理json数据是以下两个对象是必须要创建的
Json::Reader reader;
Json::Value root;
处理流程:
reader.parse(task_data->data, root);
if(root.isobject){
std::string taskJsonString = root.toStyledString(); // 将json消息内容全部转换为字符串的格式(非必要操作)
// 从json数据中获取需要的值
Json::Value msg= root["persional-msg"];
std::string teacher_name = msg["head_teacher"]["name"].asString(); // 获取字符串
uint16 teach_age = msg["head_teacher"]["age"].asUint(); // 获取整型据
float teach_hight = msg["head_teacher"]["hight"].asDouble();// 获取浮点数据
........
}
提高程序健壮性常用到的接口:
root["key_value"].isNull()----->判断是否有key_value键值:如果没有返回true
root["RouteData"].isObject()----->判断是否是RouteData对应的是否是一个对象:如果是返回true
root["RouteArrayData"].size() ---->读取RouteData数组的大小