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 ] "
|
接下来要研读研读理论方面的内容了。博文中有错误之处,欢迎指正!
声明:本博文为博主原创,转载请注明来源,谢谢合作!