基于cJson的 Qt json处理库

qt4没有原生的库对json处理,Qt5提供了json处理库,使用起来稍微感觉有点麻烦,特别是修改值的时候,非常不方便。cJSON是一个C语言编写的json处理库,已经被大量的使用,稳定性和高效性毋庸置疑,该库只包含一个.h 和 .cpp文件,使用起来非常方便,但是对于习惯Qt开发者来说,CJSON库需要自己管理内存的开辟和释放,使用不是特别方便。
QJSON库基于CJSON,进行Qt的封装,解决Qt原生使用不方便和CJSON手动管理内存的问题。本项目已经在Github上开源,QJSON,以下是头文件,一看就能明白怎么使用

主要特点

  1. json_object json_array 可以直接解析和序列化json字符串;
  2. 支持Qt4、Qt5,与Qt的类深度结合QByteArray\ QVariant \ QString等;
  3. 非常符合Qt的使用习惯;
  4. 无需手动管理内存;
  5. 使用方便简单,只需添加4个文件到工程中即可;
  6. 采用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值