0、引用
http://www.json.org/
http://www.json.org.cn/
1、Json简介
Json是一种轻量级数据交换格式。它的基本结构包括 (pair)、值的有序列表(array)。pair 结构和array结构可以统称为对象(Object);pair object中的key必须是个字符串,pair object中的value可以是任意数据类型(pair object、array object、string、int 等等). array中的成员也可以是任意类型,但要array中所有value的数据类型一致。
图1
图2
2、Jsoncpp简介
c++使用jsoncpp封装和解析json数据。重要的数据结构 Json::Value root; Json::value 就是Objec数据类型。如果要当成pair object,则使用方式如下root["key"] = value; 如果当成array object,则使用方式如下,root.append(value); Object可以嵌套使用。例如 {“name”: {"sex": "man"}},可以用jsoncpp写成 root["name"]["sex"] = "man";实际上array的valu在内部也是有key的,这个key就是序列index。
3、Jsoncpp表示Json对象
{“name”:"jolan",
“address”:{“province”:“beijing”,“area”:“haidian”},
“Hoby”:["running","coding","football"]
};
上面的Json对象用Jsoncpp可以这样描述:
Json::Value root;
root["name"] = "jolan";
root["addres"]["province"] = "beijing";
root["addres"]["area"] = "haidian";
root["Hoby"].append(“running”);
root["Hoby"].append("coding");
root["Hoby"].append("football");
如果数组的value是个Object,则写填充好Object,再append。例如 {"people":[{"name":"jolan"},{"name":"linus"}]}
Json::Value root;
Json::Value element;
element["name"] = "jolan";
root.append(element);
element["name"] = "linus";
root.append(element);
4、解析Jsoncpp对象
Jsoncpp对象读取到最后,都只能用基本类型来解析。例如: 如何解析root["addres"]["province"];面对root["addres"]["province"]的时候,要告诉Jsoncpp如何看到这个值,如果,不指定的话就默认为都是Json::value 对象;因此正确的解析应该是 std::string strPro = root["addres"]["province"].asString(),类似的,还有asDouble()、asInt()、asUInt()等等。 如果读取到的某个对象是数组列表,则用下标取出这个数据对应的value。例如 root["Hoby"][0],root["Hoby"].size()指示了数组对象的大小。
3、Jsonccpp序列化Json对象
Json::FastWriter fw;
Json::Value oRoot;
std::string stdBody = fw(oRoot)
5、Jsoncpp反序列化Json字符串
Json::Reader oReader;
Json::Value oData;
if(!oReader.parse(strRspBody.c_str(), oData, false)) {
return -50;
}
4、遍历Key字段
Json::Value::Members oMember = oData.getMemberNames();
Json::Value::Members::iterator iter;
for(iter=oMember.begin();iter != oMember.end();++iter) {
LOGSYS_WATER(_LC_DEBUG_,"key:%s",(*iter).c_str());
}