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);
}