0
点赞
收藏
分享

微信扫一扫

C++ Json解析库CJsonObject的详细使用(跨平台无须编译成库)


作者:虚坏叔叔

早餐店不会开到晚上,想吃的人早就来了!😄

C++ Json解析库CJsonObject的详细使用(跨平台无须编译成库)

​CJsonObject​​​是基于​​cJSON​​​全新开发一个C++版的​​JSON​​​库,​​CJsonObject​​的最大优势是轻量(只有4个文件,拷贝到自己代码里即可,无须编译成库,且跨平台和编译器)、简单好用,开发效率极高,对多层嵌套​​json​​​的读取和生成使用非常简单(大部分​​json​​​解析库如果要访问多层嵌套​​json​​的最里层非常麻烦)。

我一直使用的​​json​​​库是一个较老版本的​​cJSON​​​,​​cJSON​​​的好处是简单易用,而且只有两个文件,直接复制到自己的代码中就可以用。​​cJSON​​​也有一个非常容易让初用者头痛的地方,一不小心就造成​​内存泄漏​​​了。为此,我基于​​cJSON​​封装了一个C++版的 CJsonObject,该库比​​cJSON​​更简单易用,且只要不是有意不释放内存就不会发生内存泄漏。

用​​CJsonObject​​​的好处在于完全不用文档,看完​​Demo​​​马上就会用,不明白的看一下头文件就知道,所有函数都十分通俗易懂,最为关键的一点是解析​​JSON​​​和生成​​JSON​​​的编码效率非常高。当然,毕竟是经过​​cJSON​​​封装而来,效率会略低于​​cJSON​​​,​​cJSON​​​不支持的​​CJsonObject​​​也不支持。个人认为,既然已经选了​​json​​​,那一点点的解析性能差异就不重要了,如果追求性能可以选​​protobuf​​。

感谢IT界的贡献者:

2018年5月 作者:Bwar 把它开源 https://github.com/Bwar/CJsonObject,并将持续维护。

使用说明:

一、第一步添加以下文件到工程目录:

将 ​​CJsonObject.hpp​​​、 ​​CJsonObject.cpp​​​、 ​​cJSON.h​​​、 ​​cJSON.c​​四个文件加入代码目录,与用户自己的代码一起编译即可。

C++ Json解析库CJsonObject的详细使用(跨平台无须编译成库)_开源库

第二步那就很简单了废话不多说来看代码(将​​Bwar​​​的示例代码复制到​​int main()​​中)

官方事例代码:

#include #include #include "../CJsonObject.hpp"

int main()
{
int iValue;
std::string strValue;
neb::CJsonObject oJson("{\"refresh_interval\":60,"
"\"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]["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;
}

官方头文件:

/*******************************************************************************
* Project: neb
* @file CJsonObject.hpp
* @brief Json
* @author bwarliao
* @date: 2014-7-16
* @note
* Modify history:
******************************************************************************/

#ifndef CJSONOBJECT_HPP_
#define CJSONOBJECT_HPP_

#include <stdio.h>
#include <stddef.h>
#include <malloc.h>
#include <errno.h>
#include <unistd.h>
#include <limits.h>
#include <math.h>
#include <float.h>
#include <string>
#include <map>
#include "cJSON.h"


namespace neb
{

class CJsonObject
{
public: // method of ordinary json object or json array
CJsonObject();
CJsonObject(const std::string& strJson);
CJsonObject(const CJsonObject* pJsonObject);
CJsonObject(const CJsonObject& oJsonObject);
virtual ~CJsonObject();

CJsonObject& operator=(const CJsonObject& oJsonObject);
bool operator==(const CJsonObject& oJsonObject) const;
bool Parse(const std::string& strJson);
void Clear();
bool IsEmpty() const;
bool IsArray() const;
std::string ToString() const;
std::string ToFormattedString() const;
const std::string& GetErrMsg() const
{
return(m_strErrMsg);
}

public: // method of ordinary json object
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;
bool Get(const std::string& strKey, std::string& strValue) const;
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;
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);
bool Delete(const std::string& strKey);
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);

public: // method of json array
int GetArraySize();
CJsonObject& operator[](unsigned int uiWhich);
std::string operator()(unsigned int uiWhich) const;
bool Get(int iWhich, CJsonObject& oJsonObject) const;
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);
bool Delete(int 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);

private:
CJsonObject(cJSON* pJsonData);

private:
cJSON* m_pJsonData;
cJSON* m_pExternJsonDataRef;
std::string m_strErrMsg;
std::map<unsigned int, CJsonObject*> m_mapJsonArrayRef;
std::map<std::string, CJsonObject*> m_mapJsonObjectRef;
};

}

#endif /* CJSONHELPER_HPP_ */

二、读取json文件到字符串流,然后通过CJsonObject库读取

#include <fstream>
#include <iostream>
#include <string>
#include <assert.h>
#include "CJsonObject.hpp"

#define FILEJSON "test.json"

using namespace std;


string readFile(string file)
{
ifstream infile;
infile.open(file.data()); //将文件流对象与文件连接起来
assert(infile.is_open()); //若失败,则输出错误消息,并终止程序运行
string str;
char c;
while (!infile.eof())
{
infile >> c;
str += c;
}
infile.close(); //关闭文件输入流
return str;
}
int main()
{

int iValue;
bool flag;
bool a=false;
std::string strValue;

neb::CJsonObject oJson(readFile(FILEJSON));
std::cout << oJson.ToString() << std::endl;
oJson["dynamic_loading"][0]["cmd"][0].Replace("cmd", 9999);
oJson["dynamic_loading"][0]["cmd"][0].Get("cmd", iValue);
std::cout << "iValue = " << iValue << std::endl;

ofstream out(FILEJSON);
//out << oJson.ToString();//无格式转换
out << oJson.ToFormattedString();//有格式转换
out.close();
}

三、MFC中使用示例

void CJson::TransJsonRowData(CString strJsonPath)
{
std::string strJsonXmCode = CW2A(strJsonPath.GetString());
pwjson::CJsonObject oJson(readFile(strJsonXmCode));
int nArraySize = oJson.GetArraySize();

std::string str = oJson[0]["111"].ToString();
CString strDa = str.c_str();
std::string str2 = oJson[0]["222"].ToString();
CString strDa2 = str2.c_str();

for (int i = 0; i < nArraySize; i++)
{

std::string str1 = oJson[i]["111"].ToFormattedString();
CString strALTITUDE = str1.c_str();

strALTITUDE.Remove(_T('\"'));
std::string str2 = oJson[i]["222"].ToFormattedString();
CString strLATITUDE = str2.c_str();


}


}

四、总结

  • 本文主要介绍引入json库基本使用。



举报

相关推荐

0 条评论