QT学习之QScript

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);//输出到Debug
private:
   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_OBJECT
public:
    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);
}


 


 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值