推荐下cJSON的高级封装版本CJsonObject,真的很好用

版权声明:本文为博主原创文章,未经博主允许不得转载,如需转载请先得到博主的同意,如需帮助,联系[email protected],谢谢。 https://blog.csdn.net/HW140701/article/details/86748421

在这里插入图片描述

1 CJsonObject简介

CJsonObject是Bwar基于cJSON全新开发一个C++版的JSON库,CJsonObject的最大优势是轻量、简单好用,开发效率极高,尤其对多层嵌套json的读取和生成、修改极为方便。CJsonObject比cJSON简单易用得多,且只要不是有意不释放内存就不会发生内存泄漏。用CJsonObject的好处在于完全不用专门的文档,头文件即文档,看完Demo立刻就会用,所有函数都十分通俗易懂,最为关键的一点是解析JSON和生成JSON的编码效率非常高。
参考GitHub地址:https://github.com/Bwar/CJsonObject

2 CJsonObject使用

简单到只需王项目添加四个文件:cJson.h cJson.c CJsonObject.hpp CJsonObject.cpp,相关文件可以到上述GitHub地址下载最新版本。
在使用时只需包含一个头文件:

#include "CJsonObject.hpp"

3 官方使用示例

#include <mcheck.h>
#include <string>
#include <iostream>
#include "../CJsonObject.hpp"

int main()
{
    mtrace();
    int iValue;
    double fTimeout;
    std::string strValue;
    neb::CJsonObject oJson("{\"refresh_interval\":60,"
                        "\"timeout\":12.5,"
                        "\"dynamic_loading\":["
                            "{"
                                "\"so_path\":\"plugins/User.so\", \"load\":false, \"version\":1,"
                                "\"cmd\":["
                                     "{\"cmd\":2001, \"class\":\"neb::CmdUserLogin\"},"
                                     "{\"cmd\":2003, \"class\":\"neb::CmdUserLogout\"}"
                                "],"
                                "\"module\":["
                                     "{\"path\":\"im/user/login\", \"class\":\"neb::ModuleLogin\"},"
                                     "{\"path\":\"im/user/logout\", \"class\":\"neb::ModuleLogout\"}"
                                "]"
                             "},"
                             "{"
                             "\"so_path\":\"plugins/ChatMsg.so\", \"load\":false, \"version\":1,"
                                 "\"cmd\":["
                                      "{\"cmd\":2001, \"class\":\"neb::CmdChat\"}"
                                 "],"
                             "\"module\":[]"
                             "}"
                        "]"
                    "}");
     std::cout << oJson.ToString() << std::endl;
     std::cout << "-------------------------------------------------------------------" << std::endl;
     std::cout << oJson["dynamic_loading"][0]["cmd"][1]("class") << std::endl;
     oJson["dynamic_loading"][0]["cmd"][0].Get("cmd", iValue);
     std::cout << "iValue = " << iValue << std::endl;
     oJson["dynamic_loading"][0]["cmd"][0].Replace("cmd", -2001);
     oJson["dynamic_loading"][0]["cmd"][0].Get("cmd", iValue);
     std::cout << "iValue = " << iValue << std::endl;
     oJson.Get("timeout", fTimeout);
     std::cout << "fTimeout = " << fTimeout << std::endl;
     oJson["dynamic_loading"][0]["module"][0].Get("path", strValue);
     std::cout << "strValue = " << strValue << std::endl;
     std::cout << "-------------------------------------------------------------------" << std::endl;
     oJson.AddEmptySubObject("depend");
     oJson["depend"].Add("nebula", "https://github.com/Bwar/Nebula");
     oJson["depend"].AddEmptySubArray("bootstrap");
     oJson["depend"]["bootstrap"].Add("BEACON");
     oJson["depend"]["bootstrap"].Add("LOGIC");
     oJson["depend"]["bootstrap"].Add("LOGGER");
     oJson["depend"]["bootstrap"].Add("INTERFACE");
     oJson["depend"]["bootstrap"].Add("ACCESS");
     std::cout << oJson.ToString() << std::endl;
     std::cout << "-------------------------------------------------------------------" << std::endl;
     std::cout << oJson.ToFormattedString() << std::endl;

     std::cout << "-------------------------------------------------------------------" << std::endl;
     neb::CJsonObject oCopyJson = oJson;
     if (oCopyJson == oJson)
     {
         std::cout << "json equal" << std::endl;
     }
     oCopyJson["depend"]["bootstrap"].Delete(1);
     oCopyJson["depend"].Replace("nebula", "https://github.com/Bwar/CJsonObject");
     std::cout << oCopyJson.ToString() << std::endl;
     std::cout << "-------------------------key traverse------------------------------" << std::endl;
     std::string strTraversing;
     while(oJson["dynamic_loading"][0].GetKey(strTraversing))
     {
         std::cout << strTraversing << std::endl;
     }
     std::cout << "---------------add a new key, then key traverse---------------------" << std::endl;
     oJson["dynamic_loading"][0].Add("new_key", "new_value");
     while(oJson["dynamic_loading"][0].GetKey(strTraversing))
     {
         std::cout << strTraversing << std::endl;
     }
}

4 主要方法的使用

  1. 四个构造方法
    CJsonObject();  // 默认的构造方法
    CJsonObject(const std::string& strJson);  // 通过Json字符串构造
    CJsonObject(const CJsonObject* pJsonObject); // 通过对象指针构造
    CJsonObject(const CJsonObject& oJsonObject); // 通过拷贝构造函数构造
  1. 主要方法
 	CJsonObject& operator=(const CJsonObject& oJsonObject); // 重载赋值操作符
    bool operator==(const CJsonObject& oJsonObject) const; // 重载赋值操作符
    bool Parse(const std::string& strJson); // 解析json字符串
    void Clear(); // 清除内存
    bool IsEmpty() const; // 判断解析对象是否为空
    bool IsArray() const; // 判断解析对象是否为json数组
    std::string ToString() const; // 将解析对象转换为字符串
  1. 原始json解析对象主要使用的方法
    bool AddEmptySubObject(const std::string& strKey);  // 在当前的原始解析对象上添加空的子对象
    bool AddEmptySubArray(const std::string& strKey);  // 在当前的原始解析对象上添加空的子数组
    CJsonObject& operator[](const std::string& strKey); // 重载[]操作符
    std::string operator()(const std::string& strKey) const; // 重载()操作符
    bool Get(const std::string& strKey, CJsonObject& oJsonObject) const; // 得到与key值相对应的对象键值
    bool Get(const std::string& strKey, std::string& strValue) const; // 得到与key值相对应的字符串键值
    // 以下的只是根据key值获取不同数据类型的键值
    bool Get(const std::string& strKey, int32& iValue) const; 
    bool Get(const std::string& strKey, uint32& uiValue) const;
    bool Get(const std::string& strKey, int64& llValue) const;
    bool Get(const std::string& strKey, uint64& ullValue) const;
    bool Get(const std::string& strKey, bool& bValue) const;
    bool Get(const std::string& strKey, float& fValue) const;
    bool Get(const std::string& strKey, double& dValue) const;
    // 在相应的key值上添加不同数据类型的键值
    bool Add(const std::string& strKey, const CJsonObject& oJsonObject);
    bool Add(const std::string& strKey, const std::string& strValue);
    bool Add(const std::string& strKey, int32 iValue);
    bool Add(const std::string& strKey, uint32 uiValue);
    bool Add(const std::string& strKey, int64 llValue);
    bool Add(const std::string& strKey, uint64 ullValue);
    bool Add(const std::string& strKey, bool bValue, bool bValueAgain);
    bool Add(const std::string& strKey, float fValue);
    bool Add(const std::string& strKey, double dValue);
    // 删除指定的key值
    bool Delete(const std::string& strKey);
    // 根据key值替代指定的键值
    bool Replace(const std::string& strKey, const CJsonObject& oJsonObject);
    bool Replace(const std::string& strKey, const std::string& strValue);
    bool Replace(const std::string& strKey, int32 iValue);
    bool Replace(const std::string& strKey, uint32 uiValue);
    bool Replace(const std::string& strKey, int64 llValue);
    bool Replace(const std::string& strKey, uint64 ullValue);
    bool Replace(const std::string& strKey, bool bValue, bool bValueAgain);
    bool Replace(const std::string& strKey, float fValue);
    bool Replace(const std::string& strKey, double dValue);
  1. json数据使用的主要方法
    int GetArraySize();  // 得到json数组的元素数量
    CJsonObject& operator[](unsigned int uiWhich); // 重载[]操作符
    std::string operator()(unsigned int uiWhich) const; // 重载()操作符
    bool Get(int iWhich, CJsonObject& oJsonObject) const; // 得到数组iWhich索引的解析对象
    // 根据索引iWhich不同数据类型的数据
    bool Get(int iWhich, std::string& strValue) const;
    bool Get(int iWhich, int32& iValue) const;
    bool Get(int iWhich, uint32& uiValue) const;
    bool Get(int iWhich, int64& llValue) const;
    bool Get(int iWhich, uint64& ullValue) const;
    bool Get(int iWhich, bool& bValue) const;
    bool Get(int iWhich, float& fValue) const;
    bool Get(int iWhich, double& dValue) const;
    // 往数组添加不同数据类型的键值
    bool Add(const CJsonObject& oJsonObject);
    bool Add(const std::string& strValue);
    bool Add(int32 iValue);
    bool Add(uint32 uiValue);
    bool Add(int64 llValue);
    bool Add(uint64 ullValue);
    bool Add(int iAnywhere, bool bValue);
    bool Add(float fValue);
    bool Add(double dValue);
    // 往数组添加不同数据类型的键值作为第一个元素
    bool AddAsFirst(const CJsonObject& oJsonObject);
    bool AddAsFirst(const std::string& strValue);
    bool AddAsFirst(int32 iValue);
    bool AddAsFirst(uint32 uiValue);
    bool AddAsFirst(int64 llValue);
    bool AddAsFirst(uint64 ullValue);
    bool AddAsFirst(int iAnywhere, bool bValue);
    bool AddAsFirst(float fValue);
    bool AddAsFirst(double dValue);
    // 删除指定索引iWhich的元素
    bool Delete(int iWhich);
    // 替代指定索引iWhich的元素
    bool Replace(int iWhich, const CJsonObject& oJsonObject);
    bool Replace(int iWhich, const std::string& strValue);
    bool Replace(int iWhich, int32 iValue);
    bool Replace(int iWhich, uint32 uiValue);
    bool Replace(int iWhich, int64 llValue);
    bool Replace(int iWhich, uint64 ullValue);
    bool Replace(int iWhich, bool bValue, bool bValueAgain);
    bool Replace(int iWhich, float fValue);
    bool Replace(int iWhich, double dValue);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HW140701/article/details/86748421