如何移植和使用QJson?

2023-11-04

一、QJson库的下载

      下载链接   http://qjson.sourceforge.net/build/

二、使用Qt4.8+Mingw编译QJson

1、解压QJson-master压缩包,新建一个QJson目录,将QJson-master中的include 和src目录拷贝到QJson目录下。

然后,再QJson目录下创建一个qjson.pro的项目文件,在文件中编写如下内容:

TARGET = qjson

TEMPLATE = lib
CONFIG += shared
CONFIG += dll

#QMAKE_CXXFLAGS += -fexceptions
CONFIG += exceptions

DEFINES += QJSON_MAKEDLL

#Mingw
win32-g++{
    BINDIR = ../win32-gcc-bin
}

#Vs2010
#win32-msvc2010{
#    BINDIR = ../../vs2010-bin
#}

##arm-linux
#linux-arm-g++{
#    BINDIR = ../arm-linux-gcc-bin
#
#    DEFINES += __NO_PRECOMPILED_HEADER__
#    DEFINES += _TTY_POSIX_
#}

#CONFIG(debug, debug|release){
#    DESTDIR = $$BINDIR/debug
#}else{
#    DESTDIR = $$BINDIR/release
#}

SOURCES += \

HEADERS +=\

    

然后使用Qt4.8.3打开项目工程文件qjson.pro,在项目树上,添加现有文件,将include和src目录下的文件添加到qjson项目中,构建工程,正常可生成qjson.dll库文件。

三、QJson项目测试

1、新建一个Qt控制台项目 — testQjson ,在pro文件中链接qjson动态库。将qjson的include目录拷贝到当前测试项目目录下。可以将头文件添加到项目中,也可以不用添加。

#-------------------------------------------------
#
# Project created by QtCreator 2020-05-15T08:29:29
#
#-------------------------------------------------

QT       += core

QT       -= gui

TARGET = testQjson
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

DEFINES += QJSON_MAKEDLL
SOURCES += main.cpp \
    include/person.cpp

LIBS += -L$$PWD/release/bin/ -lqjson
INCLUDEPATH += $$PWD/release/bin
DEPENDPATH += $$PWD/release/bin

HEADERS += \
    include/FlexLexer.h \
    include/json_parser.hh \
    include/json_scanner.h \
    include/location.hh \
    include/parser.h \
    include/parser_p.h \
    include/parserrunnable.h \
    include/position.hh \
    include/qjson_debug.h \
    include/qjson_export.h \
    include/qobjecthelper.h \
    include/serializer.h \
    include/serializerrunnable.h \
    include/stack.hh \
    include/person.h

然后我们添加一个cpp类如下:

// person.h

#ifndef PERSON_H
#define PERSON_H

#include <QObject>

#include <QDate>
#include <QVariantMap>
#include <QDebug>
#include <QString>

class Person : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QString name READ name WRITE setName)
    Q_PROPERTY(int phoneNumber READ phoneNumber WRITE setPhoneNumber)
    Q_PROPERTY(Gender gender READ gender WRITE setGender)
    Q_PROPERTY(QDate dob READ dob WRITE setDob)
    Q_ENUMS(Gender)
public:
   Person(QObject* parent = 0);
   ~Person();

   QString name() const;
   void setName(const QString& name);

   int phoneNumber() const;
   void setPhoneNumber(const int  phoneNumber);

   enum Gender {Male, Female};
   void setGender(Gender gender);
   Gender gender() const;

   QDate dob() const;
   void setDob(const QDate& dob);

 public:
   QString m_name;
   int m_phoneNumber;
   Gender m_gender;
   QDate m_dob;
};


#endif // PERSON_H

 

// person.cpp

#include "person.h"

Person::Person(QObject *parent) : QObject(parent)
{

}


Person::~Person(){}

QString Person::name() const
{
    return m_name;
}

void Person::setName(const QString &name)
{
    m_name = name;
}

int Person::phoneNumber() const
{
    return m_phoneNumber;
}

void Person::setPhoneNumber(const int phoneNumber)
{
    m_phoneNumber = phoneNumber;
}

void Person::setGender(Person::Gender gender)
{
    m_gender = gender;
}

Person::Gender Person::gender() const
{
    return m_gender;
}

QDate Person::dob() const
{
    return m_dob;
}

void Person::setDob(const QDate &dob)
{
    m_dob = dob;
}

 

在main.cpp 文件中,我们使用QJson中几种不同的方式来生成Json字符串和解析Json字符串。

#include <QCoreApplication>

#include "../../include/parser.h"
#include "../../include/qobjecthelper.h"
#include "../../include/serializer.h"
#include "../../include/person.h"

using namespace QJson;

typedef struct {
    QString name;
    int age;
}student_t;

Q_DECLARE_METATYPE(student_t)



int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    /**一 、[将特定类中的成员变量保存在json字符串中],个人感觉其优点也是其缺点,不够灵活***********************/
    // 组成json格式 ==》 class类型
    Person person;
    person.setName("Flavio");
    person.setPhoneNumber(123456);
    person.setGender(Person::Male);
    person.setDob(QDate(1982, 7, 12));

    QVariantMap variant = QJson::QObjectHelper::qobject2qvariant(&person);
    QJson::Serializer serializer;
    QByteArray json_string =  serializer.serialize( variant);
    qDebug() << json_string;

    // "{ "dob" : "1982-07-12", "gender" : 0, "name" : "Flavio", "phoneNumber" : 123456 }"

    // json字符串解析
    QJson::Parser parser;
    bool ok;
    QVariantMap result = parser.parse(json_string, &ok).toMap();
    if (!ok) {
        qFatal("An error occurred during parsing");
        exit (1);
    }

    qDebug() << "dob:" << result["dob"].toString()
             << "  gender:" << result["gender"].toInt()
             << "  name:" << result["name"].toString()
             << "  phoneNumber:" << result["phoneNumber"].toInt();



    /**二、简单的json字符串生成*************************************/
    // json字符串生成==》 自定义类型1:
    student_t student = {"zhangshan",20};
    QVariantMap v_st;
    v_st.insert("name",student.name);
    v_st.insert("age",student.age);
    qDebug() << serializer.serialize( v_st);
    /*****************************************************************************************/

    /**三、复杂的json字符串生成****************************************************/

    // parser complex json string
    /*
     * QString json("{"
                 "\"encoding\" : \"UTF-8\","
                 "\"plug-ins\" : [\"python\",\"c++\",\"ruby\"],"
                 "\"types\":[{\"A\":1,\"B\":5},{\"A\":2,\"B\":6}],"
                 "\"indent\" : { \"length\" : 3, \"use_space\" : true }"
                 "}");
    */
    /// json字符串生成
    QVariantMap js_t;
    js_t.insert("encoding","UTF-8");

    /// 添加json对象
    QVariantMap indent_map;
    indent_map.insert("length",3);
    indent_map.insert("use_space",true);
    js_t.insert("indent",indent_map);


    /// 添加json数组对象1
    QVariantList plug_ins_list;
    plug_ins_list << "python" << "c++" << "ruby";
    js_t.insert("plug-ins",plug_ins_list);

    /// 添加json数组对象1
    QVariantList type_list;
    QVariantMap map1;
    map1.insert("A",1);
    map1.insert("B",5);

    QVariantMap map2;
    map2.insert("A",2);
    map2.insert("B",6);
    type_list << map1 << map2;
    js_t.insert("types",type_list);

    qDebug() << "***************************************************";
    QString json = serializer.serialize( js_t);
    qDebug() << json;
    qDebug() << "***************************************************";


    /// 此json字符串的解析
    result = parser.parse(json.toUtf8(), &ok).toMap();
    if (!ok) {
        qFatal("An error occurred during parsing");
        exit (1);
    }

    qDebug() << "json:" << result;

    /*   通过这里的打印结果,其实可以逆向验证我们使用QJson组成对象的方法是否正确
     *
     QMap( 
          ("encoding", QVariant(QString, "UTF-8") )
          ( "indent" ,  QVariant(QVariantMap, QMap(("length",   QVariant(qulonglong, 3) )
          ( "use_space" ,  QVariant(bool, true) ) )  ) )
          ( "plug-ins" ,  QVariant(QVariantList, (QVariant(QString, "python") ,  QVariant(QString, "c++") ,  QVariant(QString, "ruby") )  ) )
          ( "types" , 
                  QVariant(QVariantList, 
                          (
                            QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 1) ) ( "B" ,  QVariant(qulonglong, 5) ) )  ) , 
                            QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 2) ) ( "B" ,  QVariant(qulonglong, 6) ) )  ) )
                          ) 
         ) 
       )
    */


    qDebug() << "encoding:" << result["encoding"].toString();
    qDebug() << "plugins:";

    foreach (QVariant plugin, result["plug-ins"].toList()) {
        qDebug() << "\t-" << plugin.toString();
    }

    qDebug() << result["types"];
    foreach (QVariant type, result["types"].toList()) {
        qDebug() << "type:" << type;
        QVariantMap ret = type.toMap();
        qDebug() << "A:" << ret["A"].toInt() << "  B:" << ret["B"].toInt();
    }

    QVariantMap nestedMap = result["indent"].toMap();
    qDebug() << "length:" << nestedMap["length"].toInt();
    qDebug() << "use_space:" << nestedMap["use_space"].toBool();


    return a.exec();
}

打印输出结果如下:

{ "dob" : "1982-07-12", "gender" : 0, "name" : "Flavio", "phoneNumber" : 123456 }"
dob: "1982-07-12"   gender: 0   name: "Flavio"   phoneNumber: 123456
"{ "age" : 20, "name" : "zhangshan" }"
***************************************************
"{ "encoding" : "UTF-8", "indent" : { "length" : 3, "use_space" : true }, "plug-ins" : [ "python", "c++", "ruby" ], "types" : [ { "A" : 1, "B" : 5 }, { "A" : 2, "B" : 6 } ] }"
***************************************************
json: QMap(("encoding", QVariant(QString, "UTF-8") ) ( "indent" ,  QVariant(QVariantMap, QMap(("length", QVariant(qulonglong, 3) ) ( "use_space" ,  QVariant(bool, true) ) )  ) ) ( "plug-ins" ,  QVariant(QVariantList, (QVariant(QString, "python") ,  QVariant(QString, "c++") ,  QVariant(QString, "ruby") )  ) ) ( "types" ,  QVariant(QVariantList, (QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 1) ) ( "B" ,  QVariant(qulonglong, 5) ) )  ) ,  QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 2) ) ( "B" ,  QVariant(qulonglong, 6) ) )  ) )  ) ) )
encoding: "UTF-8"
plugins:
        - "python"
        - "c++"
        - "ruby"
QVariant(QVariantList, (QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 1) ) ( "B" ,  QVariant(qulonglong, 5) ) )  ) ,  QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 2) ) ( "B" ,  QVariant(qulonglong, 6) ) )  ) )  )
type: QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 1) ) ( "B" ,  QVariant(qulonglong, 5) ) )  )
A: 1   B: 5
type: QVariant(QVariantMap, QMap(("A", QVariant(qulonglong, 2) ) ( "B" ,  QVariant(qulonglong, 6) ) )  )
A: 2   B: 6
length: 3
use_space: true

 

因为比较简单,这里只做分享和记录,不过多赘述。需要相关资源的,可以留言或者私我。下一篇,我们来记录下jsoncpp的编译和使用技巧。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何移植和使用QJson? 的相关文章

随机推荐

  • Android系统 —— 源码编译错误整理(持续更新)

    记录一些日常遇到的编译问题及解决方法 查找的时候可以直接搜索问题描述的关键部分 目录 1 更改源码目录名引发的错误 2 添加VNDK库 Vendor Native Development Kit 报错 3 头文件被重复包含 4 无法链接库文
  • 【FlashDB】第三步 FlashDB 移植 STM32L475 使用QSPI驱动外部 flash W25Q64之 FlashDB 移植

    准备事项 完成了以下两步操作后进行 FlashDB 第一步 FlashDB 移植到 STM32L475 使用QSPI驱动外部 flash W25Q64之FAL移植 FlashDB 第二步 FlashDB 移植 STM32L475 使用QSP
  • Anaconda使用教程(常用命令)

    Anaconda3安装教程 配置环境变量 图文教程 https blog csdn net love906897406 article details 125010258https blog csdn net love906897406 a
  • ECharts数据可视化

    目录 第一章 什么是ECharts 第二章 搭建环境 2 1 Echarts的下载 2 2 Visual Studio Code下载 第三章 一个简单的可视化展示 第四章 Echarts组件 4 1 标题 4 2 提示框 4 3 工具栏 4
  • 机器学习实战5(回归篇)

    目录 1 回归 2 回归代码 3 预测鲍鱼的年龄 1 回归 前面的文章介绍了很多分类算法 分类的目标变量是标称型数据 而本文将会对连续型的数据做出预测 主要讲解简单的线性回归和局部加权线性回归 并通过预测鲍鱼年龄的实例进行实战演练 说到回归
  • Keil 硬件仿真时 外设寄存器中显示的定时器计数值不准确

    最近在做定时器同步测试 发现无论如何都无法正常让定时器的计数器同步起来 很郁闷 换了多个型号的单片机都不行 于是怀疑 软件仿真有问题 于是通过曲线测试 使用连个自变量 同时读取2个定时器的CNT 观察这两个变量测试的结果才 正常
  • 解决eclipse编译老是上一个程序代码问题

    使用eclipse遇到了问题 程序无论怎么运行都是之前修改前的程序结果 如下面所示 package test public class test public static void main String args TODO Auto g
  • JavaWeb核心技术——Request请求

    目录 1 Request和Response的概述 2 Request对象 2 1 Request继承体系 2 2 Request获取请求数据 2 2 1 获取请求行数据 2 2 2 获取请求头数据 2 2 3 获取请求体数据 2 2 4 获
  • educoderpython答案顺序结构程序设计_程序设计基础

    程序设计基础 一 程序设计方法与风格 1 设计方法 指设计 编制 调试程序的方法和过程 主要有结构化程序设计方法 软件工程方法和面向对象方法 2 设计风格 良好的程序设计风格 主要应注重和考虑下述一些因素 符号名的命名应具有一定的实际含义
  • navicat连接mysql1064_navicat for mysql出现1064错误怎么办

    navicat for mysql出现1064错误怎么办 存储过程 参数 代码 分隔符 长度 navicat for mysql出现1064错误怎么办 易采站长站 站长之家为您整理了navicat for mysql出现1064错误怎么办的
  • 【pandas】空数据处理

    目录 1 判断空值 isna 2 空值删除 dropna 3 空值替换 dropna 数据清洗是对一些没有用的数据进行处理的过程 很多数据集存在数据缺失 数据格式错误 错误数据或重复数据的情况 如果要使数据分析更加准确 就需要对这些没有用的
  • 机器学习策略二——优化深度学习系统

    进行误差分析 Carrying out error analysis 如果你希望让学习算法能够胜任人类能做的任务 但你的学习算法还没有达到人类的表现 那么人工检查一下你的算法犯的错误也许可以让你了解接下来应该做什么 这个过程称为错误分析 假
  • C++如何做字符串分割(5种方法)

    1 用strtok函数进行字符串分割 原型 char strtok char str const char delim 功能 分解字符串为一组字符串 参数说明 str为要分解的字符串 delim为分隔符字符串 返回值 从str开头开始的一个
  • 卷积神经网络(CNN)详解与代码实现

    1 应用场景 卷积神经网络的应用不可谓不广泛 主要有两大类 数据预测和图片处理 数据预测自然不需要多说 图片处理主要包含有图像分类 检测 识别 以及分割方面的应用 图像分类 场景分类 目标分类 图像检测 显著性检测 物体检测 语义检测等等
  • 关于二阶锥优化(SOCP)的学习

    原来 数学不好的时候 真的很难深入下去做研究 最近的两个月时间里 我就边学习SOCP相关的理论知识 一边拿它当工具来分析多视角几何中的问题 包括Triangulation Homography Estimation等 接触到SOCP的起因在
  • Linux脚本启动jar包

    注意 以下脚本笔者是在Windows上编辑的 因此默认格式是dos 如果在Linux上使用 请使用vi命令编该文件 改为Unix格式 笔者使用的SpringBoot jsp 因此使用的是war包 如果你使用的是jar包 在文中用到war的地
  • 【notepad++】中删除中文字符

    一 龥
  • html中图片自动循环滚动代码,实现长图片自动循环滚动效果

    实现思路 滚动效果用实现 有个方法 可以滚动到指定位置 有滚动效果 不是直接到指定位置 不了解的看这里种定位滚动方式演示 每一个Item是一张长图 这样首尾相接滚动起来 滚到无限远 就是无限循环的效果 然后再改变滚动的速度 就可以了 sav
  • SVM实现MNIST手写数字识别的实验

    本文是对手写数字识别 二 SVM 实现Mnist image 手写数字图像识别 Sanger1990的博客 CSDN博客 mnist svm 文章中程序的小修改 使代码正常完成预定工作 原代码不能正常完成运行 from PIL import
  • 如何移植和使用QJson?

    一 QJson库的下载 下载链接 http qjson sourceforge net build 二 使用Qt4 8 Mingw编译QJson 1 解压QJson master压缩包 新建一个QJson目录 将QJson master中的