QT中有解析Json的一个类叫QScript。貌似还有一个QJson,但听说解析的方便性不如QScript,具体没有深入探究,这里仅简单记录一下QScript的使用。

首先,主要使用到的类有QScriptEngine和QScriptValue,这里写了一个Demo,是用来将一个存有Json语句的QString解析后存入XML里并在Debug里显示出来。由于理论知识装备的并不充足,所以就先实战一下吧。写入XML方法使用的是QXmlStreamWriter类。

首先,建议使用窗口,即使是空窗口。因为这样当你关闭窗口的时候程序就会自动结束。那使用如下代码呢?

1
2
3
4
5
6
int main(int argc, char *argv[]){
    dbg<<"This is a Test !";
    QScriptJson qsj("D:\\json.xml");//QScriptJson是接下来自己定义的类
    qsj.write2File();
    return 0;
}

NO !会出现下面的错误信息:

QScriptEngine: Must construct a Q(Core)Application before a QScriptEngine

意思就是要使用QScriptEngine,必须要先构造一个Q(Core)Application,所以老老实实构造一个吧。

下面是我的程序代码:

【AHeaders.h】加上了要使用的头文件

1
2
3
4
5
6
7
8
9
10
11
#ifndef AHEADERS_H
#define AHEADERS_H
 
#include <QDebug>
#include <QVariant>
#include <QString>
#include <QStringList>
#include <QXmlStreamWriter>
#define dbg qDebug()
 
#endif // AHEADERS_H

【qscriptjson.h】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef QSCRIPTJSON_H
#define QSCRIPTJSON_H
 
#include <QScriptEngine>
#include <QScriptValue>
#include <QScriptValueIterator>
#include <QFile>
#include <QMap>
#include "AHeaders.h"
 
class QScriptJson
{
public:
   QScriptJson(const QString &fileName);
   ~QScriptJson();
 
   bool write2File();
private:
   void getPropety(QScriptValue sv, QStringList sLsPty);//输出到XML
   void getPropety(QScriptValue sv, QStringList sLsPty,QString space);//输出到Debug
private:
   QXmlStreamWriter m_writer;
   QString m_fileName;
   QMap<QString,QVariant> m_mapProperty; //存放数据层次属性
   QMap<QString,QVariant> m_mapItems;   //节点中的子节点集
};
 
#endif // QSCRIPTJSON_H

【qscriptjson.cpp】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include "qscriptjson.h"
//要处理的数据
static QString datas =
        QString("{'billcount':2,'bills':[\
         {'billID':'010101001','billname':'平整场地','billunit':'m2','decount':3,\
            'des':[{'deID':'A1-1','decont':'建筑场地挖填高度在±30cm以内的找平','dename':'平整场地','deunit':'100m2'},\
                {'deID':'A1-3','decont':'土方开挖','dename':'人工挖土方 三类土 深度在1.5m内','deunit':'100m3'},\
                {'deID':'A1-4','decont':'土方开挖','dename':'人工挖土方 四类土 深度在1.5m内','deunit':'100m3'}]},\
        {'billID':'010101005','billname':'挖淤泥、流砂','billunit':'m3','decount':1,\
            'des':[{'deID':'A1-27','decont':'挖淤泥、流砂','dename':'人工挖淤泥流砂','deunit':'100m3'}]}]}");
 
QScriptJson::QScriptJson(const QString &fileName)
{
    m_fileName=fileName;
    QStringList sls;
    m_mapProperty.insert("_BEGIN_","BillTable");
    sls<<"billcount"<<"bills";
    m_mapProperty.insert("BillTable",sls);
    sls.clear();
    sls<<"billID"<<"billname"<<"billunit"<<"decount"<<"des";
    m_mapProperty.insert("bills",sls);
    sls.clear();
    sls<<"deID"<<"decont"<<"dename"<<"deunit";
    m_mapProperty.insert("des",sls);
    sls.clear();
    m_mapProperty.insert("_END_","_END_");
 
    m_mapItems.insert("bills","BillItem");
    m_mapItems.insert("des","DesItem");
 
}
 
QScriptJson::~QScriptJson()
{
 
}
 
bool QScriptJson::write2File()
{
    QString dt=datas;
    QFile file(m_fileName);
    if (!file.open(QFile::WriteOnly | QFile::Text)) {
        dbg<<QString("打不开文件 : %1").arg (m_fileName);
        return false;
    }
    try{
        m_writer.setDevice(&file);
        m_writer.setAutoFormatting(true);
        //文档开始
        m_writer.writeStartDocument();
 
        QScriptEngine engine;
        QScriptValue sv = engine.evaluate("value="+dt);
        QString strBegin=m_mapProperty.value("_BEGIN_").toString();
 
        m_writer.writeStartElement(strBegin);
        QStringList sLsPty=m_mapProperty.value(strBegin).toStringList();
        getPropety(sv,sLsPty," ");
        getPropety(sv,sLsPty);
        m_writer.writeEndElement();
        m_writer.writeEndDocument();
    }catch(...){
         dbg<<"Error: Write to File .";
         file.close();
    }
    file.close();
}
 
void QScriptJson::getPropety(QScriptValue sv,QStringList sLsPty)
{
    foreach(QString element,sLsPty){
        QScriptValue sptV=sv.property(element);
        if(!sptV.isArray()){
            QString value=sptV.toString();
            m_writer.writeAttribute(element,value);
        }else{
            m_writer.writeStartElement(element);
 
            QScriptValueIterator it(sptV);
            while (it.hasNext()) {
                it.next();               
                if(it.flags()&&QScriptValue::SkipInEnumeration)continue;
                QString item=m_mapItems.value(element).toString();
                m_writer.writeStartElement(item);
                QStringList sLs_Child=m_mapProperty.value(element).toStringList();
                getPropety(it.value(),sLs_Child);
                m_writer.writeEndElement();
            }
            m_writer.writeEndElement();
        }
    }
}
 
void QScriptJson::getPropety(QScriptValue sv, QStringList sLsPty,QString space)
{
    foreach(QString str,sLsPty){
        QScriptValue sptV=sv.property(str);
        if(!sptV.isArray()){
            QString str2=sptV.toString();
            dbg<<(space+str+QString(" : ")+str2);  //如果当前属性不是一个数组,则输出其内容
        }else{
            dbg<<(space+str+QString(" [ "));
            QScriptValueIterator it(sptV);
//            dbg<<it.name()<<it.value().toString();
//            if(it.hasNext())it.next();
            while (it.hasNext()) {
                it.next();
//                dbg<<it.name()<<it.value().toString();
                if(it.flags()&&QScriptValue::SkipInEnumeration)continue;
                QStringList sLs_Child=m_mapProperty.value(str).toStringList();
                getPropety(it.value(),sLs_Child,space+"   ");
//                it.next();
            }
//            dbg<<it.name()<<it.value().toString();
            dbg<<(space+str+QString(" ] "));
        }
    }
}

至此,主要文件结束,下面是一个窗口文件:

【mainwindow.h】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QTextEdit>
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QString strText, QWidget *parent = 0);
    ~MainWindow();
    void setText(QString strText);
private:
    QTextEdit *m_te;
    QString m_text;
};
 
#endif // MAINWINDOW_H

【mainwindow.cpp】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "mainwindow.h"
 
 
MainWindow::MainWindow(QString strText,QWidget *parent)
    : QMainWindow(parent)
{
   m_text=strText;
   m_te=new QTextEdit(this);
   m_te->setText(m_text);
   this->setCentralWidget(m_te);
}
 
MainWindow::~MainWindow()
{
    delete m_te;
}
 
void MainWindow::setText(QString strText)
{
    m_text=m_text+"\n"+strText;
    m_te->setText(m_text);
}

最后上Main函数!

【main.cpp】

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mainwindow.h"
#include <QApplication>
#include "qscriptjson.h"
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w("程序开始。。。");
    w.show();
 
    dbg<<"This is a Test !";
    QScriptJson qsj("D:\\json.xml");
    qsj.write2File();
 
    w.setText("程序已运行完成!\n\n关闭窗口退出程序。。。");
    return a.exec();
}

运行后生成的XML文档“json.xml”如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<BillTable billcount="2">
    <bills>
        <BillItem billID="010101001" billname="平整场地" billunit="m2" decount="3">
            <des>
                <DesItem deID="A1-1" decont="建筑场地挖填高度在±30cm以内的找平" dename="平整场地" deunit="100m2"/>
                <DesItem deID="A1-3" decont="土方开挖" dename="人工挖土方 三类土 深度在1.5m内" deunit="100m3"/>
                <DesItem deID="A1-4" decont="土方开挖" dename="人工挖土方 四类土 深度在1.5m内" deunit="100m3"/>
            </des>
        </BillItem>
        <BillItem billID="010101005" billname="挖淤泥、流砂" billunit="m3" decount="1">
            <des>
                <DesItem deID="A1-27" decont="挖淤泥、流砂" dename="人工挖淤泥流砂" deunit="100m3"/>
            </des>
        </BillItem>
    </bills>
</BillTable>

Debug输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
This is a Test !
" billcount : 2"
" bills [ "
"    billID : 010101001"
"    billname : 平整场地"
"    billunit : m2"
"    decount : 3"
"    des [ "
"       deID : A1-1"
"       decont : 建筑场地挖填高度在±30cm以内的找平"
"       dename : 平整场地"
"       deunit : 100m2"
"       deID : A1-3"
"       decont : 土方开挖"
"       dename : 人工挖土方 三类土 深度在1.5m内"
"       deunit : 100m3"
"       deID : A1-4"
"       decont : 土方开挖"
"       dename : 人工挖土方 四类土 深度在1.5m内"
"       deunit : 100m3"
"    des ] "
"    billID : 010101005"
"    billname : 挖淤泥、流砂"
"    billunit : m3"
"    decount : 1"
"    des [ "
"       deID : A1-27"
"       decont : 挖淤泥、流砂"
"       dename : 人工挖淤泥流砂"
"       deunit : 100m3"
"    des ] "
" bills ] "

接下来要研读研读理论方面的内容了。博文中有错误之处,欢迎指正!

声明:本博文为博主原创,转载请注明来源,谢谢合作!

最新文章

  1. node.js之开发环境搭建
  2. jquery 让滚动条处于div底部
  3. css学习中的一些英文单词
  4. 【hibernate 执行方法未插入数据库】hibernate的save方法成功执行,但是未插入到数据库
  5. HDU 1394 Minimum Inversion Number(线段树求逆序对)
  6. Link Collecting
  7. Swift结构体与类
  8. AndroidManifest.xml中的application中的name属性 分类: android 学习笔记 2015-07-17 16:51 116人阅读 评论(0) 收藏
  9. PHP判断图片是否存在和jquery中load事件对图片的处理
  10. Servie之前台Service
  11. SSH之免密登陆
  12. cell的复用机制
  13. idea解决Maven jar依赖冲突(四)
  14. [CSS] Frequently used method or solutions for issues
  15. 5.移动终端App测试点归纳
  16. opus在arm的嵌入式平台上的移植和开发
  17. python学习之路02
  18. android 去掉标题栏、状态栏、横屏
  19. mysql 存储过程实例
  20. 通过Windows Server 2008 R2建立iSCSI存储

热门文章

  1. setlocal 本地变量详解
  2. 关于Django在写小项目的一些小注意事项
  3. 字符串 Instant 互转
  4. jq得到总价
  5. mysql隔离级别与锁,接口并发响应速度的关系(1)
  6. jgroups-raft
  7. Windows无法启动 VMware Workstation server服务解决方法
  8. mapreduce去重
  9. docker+ bind mount 部署复杂flask应用
  10. Not so Mobile UVA - 839