简介:这是一个轻量级但功能齐全,可以满足你对json的任何操作的C++解析Json库。
名称:MvJson
代码规模:600+行
系统平台:不限制
编译器版本:不限制
源代码编码:utf-8
json字符串编码:utf-8
与RapidJSON比较:效率更高,代码更简单,使用更方便
项目地址:https://github.com/fox136/MvJson
项目wiki: https://github.com/fox136/MvJson/wiki
API介绍:
CMvJson(const std::string& strSrc); // 利用字符串构造对象,若该字符串满足json语法,则构建成功,否则失败。
CMvJson& operator[](const std::string& strMapKey); // 操作符重载
CMvJson& operator[](size_t nVecIndex); // 操作符重载,若下标非法,则返回一个无效对象。
CMvJson& operator=(const std::string& strValue); // 操作符重载
CMvJson& operator=(double dValue); // 操作符重载
CMvJson& operator=(const CMvJson& dValue); // 操作符重载
int erase(const std::string& strKey); // 删除map对象的一个元素
int push_back(const CMvJson& oMvJson); // 向数组添加一个元素
int pop_back(void); // 删除数组对象最后一个元素
std::string GetString(void); // 获取字符串类型对象的字符串
std::string GetStringPro(void); // 获取任意类型对象字符串
int GetType(void); // 获取对象类型
int size(void); // 获取元素个数
std::map<std::string, CMvJson>::iterator begin_map(void); // 获取开始位置
std::map<std::string, CMvJson>::iterator end_map(void); // 获取结束位置
std::vector<CMvJson>::iterator begin_vector(void); // 获取开始位置
std::vector<CMvJson>::iterator end_vector(void); // 获取结束位置
使用示例1:字符串和json对象相互转换
std::string strJson = textFileRead("test.json");
cout << "原始字符串:" << strJson << endl;
CMvJson oMvJson = CMvJson(strJson);
cout << "Json还原的:" << oMvJson.GetStringPro() << endl;
使用示例2:获取元素的值(获取元素的值之前,不需要做任何判断,如果获取不到该位置的元素则返回一个永远为空的对象)
cout << endl << "获取元素的值:" << endl;
cout << "a1: " << oMvJson["a1"].GetStringPro() << endl;
cout << "a2: " << oMvJson["a2"].GetStringPro() << endl;
cout << "a3: " << oMvJson["a3"].GetStringPro() << endl;
cout << "a4: " << oMvJson["a4"].GetString() << endl;
cout << "a5: " << oMvJson["a5"].GetStringPro() << endl;
cout << "a6: " << oMvJson["bb"]["bb"]["a6"].GetStringPro() << endl;
cout << "a7: " << oMvJson["bb"]["cc"][0]["cc"][1][0][0]["a7"].GetString() << endl;
cout << "a8: " << oMvJson["a8"].GetString() << endl;
cout << "a9: " << oMvJson["a9"].GetStringPro() << endl;
使用示例3:遍历元素的值
cout << endl << "遍历map元素的值" << endl;
map<string, CMvJson>::iterator iteMap = oMvJson.begin_map();
for (; iteMap != oMvJson.end_map(); ++iteMap)
{
cout << iteMap->first << ": " << iteMap->second.GetStringPro() << endl;
}
cout << endl << "遍历数组元素的值:方法一" << endl;
CMvJson& vecMj = oMvJson["bb"]["cc"][0]["cc"][0];
vector<CMvJson>::iterator iteVec = vecMj.begin_vector();
for (; iteVec != vecMj.end_vector(); ++iteVec)
{
cout << iteVec->GetStringPro() << endl;
}
cout << endl << "遍历数组元素的值:方法二" << endl;
for (int i = 0; i < vecMj.size(); ++i)
{
cout << vecMj[i].GetStringPro() << endl;
}
使用示例4:修改增加,删除一个元素的值
cout << endl << "map修改一个元素的值" << endl;
cout << "map修改前:a9: " << oMvJson["a9"].GetStringPro() << endl;
oMvJson["a9"] = "你很棒哦!";
cout << "map修改后:a9: " << oMvJson["a9"].GetStringPro() << endl;
cout << endl << "map增加一个元素" << endl;
oMvJson["a10"] = "你很棒哦!123";
cout << "a10: " << oMvJson["a10"].GetStringPro() << endl;
cout << endl << "map删除一个元素" << endl;
oMvJson.erase("a10");
cout << "map删除后:a10: " << oMvJson["a10"].GetStringPro() << endl;
cout << endl << "数组修改一个元素值" << endl;
if (vecMj.size() > 0 && vecMj.GetType() == CMvJson::OBJ_TYPE_VECTOR)
{
cout << "数组修改前:vecMj[0]: " << vecMj[0].GetStringPro() << endl;
vecMj[0] = CMvJson("[]");
cout << "数组修改后:vecMj[0]: " << vecMj[0].GetStringPro() << endl;
}
if (vecMj.GetType() == CMvJson::OBJ_TYPE_VECTOR)
{
cout << endl << "数组增加一个元素" << endl;
vecMj.push_back(vecMj);
cout << "vecMj[vecMj.size()-1]: " << vecMj[vecMj.size() - 1].GetStringPro() << endl;
}
使用示例5:创建一个全新的对象
cout << endl << "创建一个全新的数组" << endl;
CMvJson myJson = CMvJson("{}");
myJson["学号"] = "00001";
myJson["姓名"] = "玛丽";
myJson["学校"] = "东兰县高级中学";
myJson["是否三好学生"] = CMvJson::OBJ_TRUE;
myJson["旷课记录"] = CMvJson::OBJ_NULL;
myJson["科目"] = CMvJson("[]");
CMvJson& mjKm = myJson["科目"];
CMvJson chinese = CMvJson("{}");
chinese["科目"] = "语文";
chinese["分数"] = 100;
mjKm.push_back(chinese);
string strMath = "{\"科目\":\"数学\",\"分数\":110}";
mjKm.push_back(CMvJson(strMath));
map<string, CMvJson>::iterator iteMyJson = myJson.begin_map();
for (; iteMyJson != myJson.end_map(); ++iteMyJson)
{
cout << iteMyJson->first << ": " << iteMyJson->second.GetStringPro() << endl;
}
如果还想知道更多,那请阅读源代码吧:https://github.com/fox136/MvJson, 代码本身就是一种注释。
补充:还有一点要说明的是,程序提供一对宏方便程序员调试,准确的说应该是为了帮助自己调试。如果该程序在哪个环节运行得不到预期的结果,只需要在那个环节开始位置和结束位置加上如下两个宏,它就能帮忙打印函数调用栈和每个函数运行结果的状态码。(这个宏默认是关闭的,如果需要打开,只需要在mv_json.h打开就好了)
int main()
{
TRACK_LOG_RESET; // 开始监控log
test1();
TRACK_LOG_SHOW; // 打印监控到的log
return 0;
}
使用方法:
将mv_json.h和mv_json.cpp复制到你的项目即可。
测试代码使用示例:
linux平台:将mv_json.h,mv_json.cpp,main.cpp和test.json复制到一个空目录,然后运行命令: g++ mv_json.cpp main.cpp && ./a.out
window平台: 下载vs2019,新建一个空的控制台程序,将mv_json.h,mv_json.cpp,main.cpp和test.json复制到新建的项目,点击运行就即可
测试程序输出结果:
原始字符串:{
"a1": null,
"a2": true,
"a3": false,
"a4": "123",
"a5": {
"aa": "aa"
},
"bb": {
"aa": "aa",
"bb": {
"a6": "bb"
},
"cc": [
{
"cc": [
[
{
"联系地址": "深圳"
},
{
"工作单位": "九月九集团有限责任公司"
},
{
"联系电话": "186*****2694"
},
{
"职务": "超高级开发工程师"
}
],
[
[
{
"a7": "dd"
}
]
]
]
}
]
},
"a8": "",
"a9": 123.456
}
Json还原的:{"a1":null,"a2":true,"a3":false,"a4":"123","a5":{"aa":"aa"},"a8":"","a9":123.456,"bb":{"aa":"aa","bb":{"a6":"bb"},"cc":[{"cc":[[{"联系地址":"深圳"},{"工作单位":"九月九集团有限责任公司"},{"联系电话":"186*****2694"},{"职务":"超高级开发工程师"}],[[{"a7":"dd"}]]]}]}}
获取元素的值:
a1: null
a2: true
a3: false
a4: 123
a5: {"aa":"aa"}
a6: "bb"
a7: dd
a8:
a9: 123.456
遍历map元素的值
a1: null
a2: true
a3: false
a4: "123"
a5: {"aa":"aa"}
a8: ""
a9: 123.456
bb: {"aa":"aa","bb":{"a6":"bb"},"cc":[{"cc":[[{"联系地址":"深圳"},{"工作单位":"九月九集团有限责任公司"},{"联系电话":"186*****2694"},{"职务":"超高级开发工程师"}],[[{"a7":"dd"}]]]}]}
遍历数组元素的值:方法一
{"联系地址":"深圳"}
{"工作单位":"九月九集团有限责任公司"}
{"联系电话":"186*****2694"}
{"职务":"超高级开发工程师"}
遍历数组元素的值:方法二
{"联系地址":"深圳"}
{"工作单位":"九月九集团有限责任公司"}
{"联系电话":"186*****2694"}
{"职务":"超高级开发工程师"}
map修改一个元素的值
map修改前:a9: 123.456
map修改后:a9: "你很棒哦!"
map增加一个元素
a10: "你很棒哦!123"
map删除一个元素
map删除后:a10:
数组修改一个元素值
数组修改前:vecMj[0]: {"联系地址":"深圳"}
数组修改后:vecMj[0]: []
数组增加一个元素
vecMj[vecMj.size()-1]: [[],{"工作单位":"九月九集团有限责任公司"},{"联系电话":"186*****2694"},{"职务":"超高级开发工程师"}]
创建一个全新的数组
姓名: "玛丽"
学号: "00001"
学校: "东兰县高级中学"
旷课记录: null
是否三好学生: true
科目: [{"分数":100,"科目":"语文"},{"分数":110,"科目":"数学"}]