qt4没有原生的库对json处理,Qt5提供了json处理库,使用起来稍微感觉有点麻烦,特别是修改值的时候,非常不方便。cJSON是一个C语言编写的json处理库,已经被大量的使用,稳定性和高效性毋庸置疑,该库只包含一个.h 和 .cpp文件,使用起来非常方便,但是对于习惯Qt开发者来说,CJSON库需要自己管理内存的开辟和释放,使用不是特别方便。
QJSON库基于CJSON,进行Qt的封装,解决Qt原生使用不方便和CJSON手动管理内存的问题。本项目已经在Github上开源,QJSON,以下是头文件,一看就能明白怎么使用
主要特点
- json_object json_array 可以直接解析和序列化json字符串;
- 支持Qt4、Qt5,与Qt的类深度结合QByteArray\ QVariant \ QString等;
- 非常符合Qt的使用习惯;
- 无需手动管理内存;
- 使用方便简单,只需添加4个文件到工程中即可;
- 采用utf-8编码,支持中文;
//使用示例
json_object obj
obj.insert("double", 12.32132);
obj.insert("int", 456);
obj.insert("bool", true);
json_array array;
array.append(1);
array.append(true);
array.append("string");
array.append(tr("中文乱码"));
array.append(12.324);
array.append(obj);
qDebug() << array.format_string();
qDebug() << obj.format_string() << obj.value("double").toDouble();
json_object obj1("{\"key\":1}");
qDebug() << obj1.value("key").toInt();
头文件
ben#ifndef QJSON_HEADER_20200623
#define QJSON_HEADER_20200623
#include <QObject>
#include <QVariant>
#include <QStringList>
#include <QByteArray>
struct cJSON;
class json_object;
class json_array;
class json_attribute;
class json_value;
//基类,实现了一些共同的方法
class json_interface
{
protected:
typedef void (*unspecified_bool_type)(json_interface***);
public:
json_interface();
explicit json_interface(cJSON *json);
explicit json_interface(QByteArray json);
json_interface(const json_interface* obj);
json_interface(const json_interface& obj);
virtual ~json_interface();
// Safe bool conversion operator
operator bool() const;
bool operator !() const;
json_interface& operator=(const json_interface& json);
bool operator==(const json_interface& json) const;
bool parse(QByteArray json_string);
bool is_empty() const;
QByteArray json_string() const;
QString format_string() const;
void clear();
cJSON *internal_object() const;
protected:
enum json_type_enum
{
json_type_object,
json_type_array
};
void create(json_type_enum type);
cJSON *parse_create(QByteArray json_string);
cJSON *m_json;
QString m_errorMsg;
};
class json_value
{
public:
enum Type_Enum
{
Type_Unvalid,
Type_Bool,
Type_Int,
Type_Double,
Type_String,
Type_Object,
Type_Array
};
json_value();
json_value(bool b);
json_value(double n);
json_value(const QString & s);
json_value(const char * s);
json_value(const json_value & other);
json_value(int n);
json_value(qint64 n);
json_value(const json_object &obj);
json_value(const json_array &a);
bool toBool() const;
double toDouble() const;
int toInt() const;
QString toString() const;
json_object toObject() const;
json_array toArray() const;
Type_Enum type() const;
bool is_empty() const;
protected:
Type_Enum m_type;
QVariant m_value;
};
class json_object: public json_interface
{
public:
json_object();
explicit json_object(cJSON *json);
explicit json_object(QByteArray json);
json_object(const json_object* obj);
json_object(const json_object& obj);
//if key no exist add, or replace it
bool insert(const QString &key, const json_value &value);
json_value value(const QString &key);
json_object object(const QString &key);
json_array array(const QString &key);
QStringList keys();
bool exist(QString key);
//remove key
void remove(const QString &key);
};
class json_array: public json_interface
{
public:
json_array();
explicit json_array(cJSON *json);
explicit json_array(QByteArray json);
json_array(const json_array* obj);
json_array(const json_array& obj);
bool append(const json_value &value);
int size() const;
void remove(int index);
json_value value(int index) const;
//快捷获取object值,也可以通过json_value获取
json_object object(int index) const;
json_array array(int index) const;
bool replace(int index, const json_value &value);
};
#endif // PUGIJSON_H