C++解析json开源库MvJson介绍

1 篇文章 0 订阅

简介:这是一个轻量级但功能齐全,可以满足你对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,"科目":"数学"}]

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值