QT学习之QScript

来源:互联网 发布:智尚网络 培训 编辑:程序博客网 时间:2024/05/21 02:36

http://www.cnblogs.com/lomper/p/4138281.html

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

下面是debug中的结果:

" billcount : 2"" bills [ ""    billID : 010101001""    billname : billname11""    billunit : m2""    decount : 3""    des [ ""       deID : A1-1""       decont : decont111""       dename : dename111""       deunit : 100m2""       deID : A1-3""       decont : decont111""       dename : dename111""       deunit : 100m3""       deID : A1-4""       decont : decont111""       dename : dename111""       deunit : 100m3""    des ] ""    billID : 010101005""    billname : billname111""    billunit : m3""    decount : 1""    des [ ""       deID : A1-27""       decont : decont111""       dename : dename111""       deunit : 100m3""    des ] "" bills ] "
<p style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-family:'Courier'; font-size:11pt; color:#aa00aa;">itsv "_data" "_data" "[object Object]"</span></p><p style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-family:'Courier'; font-size:11pt; color:#aa00aa;">sv "[object Object]"</span></p><p style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-family:'Courier'; font-size:11pt; color:#aa00aa;">sptdataV "[object Object]"</span></p><p style="margin-top: 0px; margin-bottom: 0px;"><span style=" font-family:'Courier'; font-size:11pt; color:#aa00aa;">sptdataV "helloworldvalue" "helloworldvalue" "0.4907147960205781"</span></p>
下面是helloworldjson.xml中的结果:
<?xml version="1.0" encoding="UTF-8"?><BillTable billcount="2">    <bills>        <BillItem billID="010101001" billname="billname11" billunit="m2" decount="3">            <des>                <DesItem deID="A1-1" decont="decont111" dename="dename111" deunit="100m2"/>                <DesItem deID="A1-3" decont="decont111" dename="dename111" deunit="100m3"/>                <DesItem deID="A1-4" decont="decont111" dename="dename111" deunit="100m3"/>            </des>        </BillItem>        <BillItem billID="010101005" billname="billname111" billunit="m3" decount="1">            <des>                <DesItem deID="A1-27" decont="decont111" dename="dename111" deunit="100m3"/>            </des>        </BillItem>    </bills></BillTable>
下面是代码:

AHeaders.h:

#ifndef AHEADERS_H#define AHEADERS_H #include <QDebug>#include <QVariant>#include <QString>#include <QStringList>#include <QXmlStreamWriter>#define dbgtx qDebug() #endif // AHEADERS_H
qscriptjson.h:
<pre name="code" class="cpp">#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();   void selfTestFunc(QString str);private:   void getPropety(QScriptValue sv, QStringList sLsPty);//输出到XML   void getPropety(QScriptValue sv, QStringList sLsPty,QString space);//输出到Debugprivate:   QXmlStreamWriter m_writer;   QString m_fileName;   QMap<QString,QVariant> m_mapProperty; //存放数据层次属性   QMap<QString,QVariant> m_mapItems;   //节点中的子节点集}; #endif // QSCRIPTJSON_H

qscriptjson.cpp:

<pre name="code" class="cpp">#include "qscriptjson.h"//要处理的数据static QString datas =        QString("{'billcount':2,'bills':[\         {'billID':'010101001','billname':'billname11','billunit':'m2','decount':3,\            'des':[{'deID':'A1-1','decont':'decont111','dename':'dename111','deunit':'100m2'},\                {'deID':'A1-3','decont':'decont111','dename':'dename111','deunit':'100m3'},\                {'deID':'A1-4','decont':'decont111','dename':'dename111','deunit':'100m3'}]},\        {'billID':'010101005','billname':'billname111','billunit':'m3','decount':1,\            'des':[{'deID':'A1-27','decont':'decont111','dename':'dename111','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)) {        dbgtx<<QString("can not open file : %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(...){         dbgtx<<"Error: Write to File .";         file.close();    }    file.close();}//"{\"_data\":{\"value\":0.4907147960205781}}";void QScriptJson::selfTestFunc(QString str){    QString dt=str;    QScriptEngine engine;    QScriptValue sv = engine.evaluate("value="+dt);    QScriptValueIterator itsv(sv);    while (itsv.hasNext())    {        itsv.next();        if(itsv.flags()&&QScriptValue::SkipInEnumeration)continue;        QScriptValue spV=itsv.value();        qDebug()<<"itsv"<<itsv.name()<<itsv.scriptName().toString()<<spV.toString();    }    qDebug()<<"sv"<<sv.toString();    bool bisNull = sv.isNull();    QScriptValue sptdataV=sv.property("_data");    qDebug()<<"sptdataV"<<sptdataV.toString();    bool  bb = sptdataV.isArray();    //if(!sptdataV.isArray())    {        QScriptValueIterator it(sptdataV);        while (it.hasNext())        {            it.next();            if(it.flags()&&QScriptValue::SkipInEnumeration)continue;            QScriptValue spV=it.value();            qDebug()<<"sptdataV"<<it.name()<<it.scriptName().toString()<<spV.toString();        }    }}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();            dbgtx<<(space+str+QString(" : ")+str2);  //如果当前属性不是一个数组,则输出其内容        }else{            dbgtx<<(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();            dbgtx<<(space+str+QString(" ] "));        }    }}
mainwindow.h:
<pre name="code" class="cpp">#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QTextEdit>#define dbgtx qDebug()namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QString strText,QWidget *parent = 0);    ~MainWindow();    void setText(QString strText);    private:        QTextEdit *m_te;        QString m_text;private:    //Ui::MainWindow *ui;};#endif // MAINWINDOW_H

mainwindow.cpp:
<pre name="code" class="cpp">#include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QString strText,QWidget *parent) :    QMainWindow(parent)//,    //ui(new Ui::MainWindow){    //ui->setupUi(this);    /* 3\x00\x00\x00\x02result\x00\x02\x00\x00\x00""1\x00\x02message\x00\x13\x00\x00\x00\xE6\x9C\x8D\xE5\x8A\xA1\xE5\xB7\xB2\xE5\xAD\x98\xE5\x9C\xA8\xEF\xBC\x81\x00\x00{"_data":{"value":0.4907147960205781}} */    //testjson();    m_text=strText;       m_te=new QTextEdit(this);       m_te->setText(m_text);       this->setCentralWidget(m_te);}MainWindow::~MainWindow(){    delete m_te;    //delete ui;}void MainWindow::setText(QString strText){    m_text=m_text+"\n"+strText;    m_te->setText(m_text);}







0 0
原创粉丝点击