**
利用QScript解析json
**
由于QT4缺少QJson模块,无法使用QJson的方式便捷的解析json字符串,本文在此提供另一种方式进行解析,应该可以解决80%~90%的问题。环境是Linux下的QT4.8,由简到难,提供三段代码供大家参考。
首先pro文件包含
QT += script
包含头文件
#include <QScriptEngine>
#include <QScriptValueIterator>
情况一:
QString strJson = "{\"department\":\"computer science\", \"person number\":\"45\", \"student\":[{\"Name\":\"ccf\",\"Math\":\"95\", \"Chinese\":\"84\"}, {\"Name\":\"zhangsan\",\"Math\":\"75\", \"Chinese\":\"70\"}]}";
QScriptEngine engine;
QScriptValue sc = engine.evaluate("value=" + strJson);
qDebug() << "department:" << sc.property("department").toString() << "person number:" << sc.property("person number").toString() << sc.property("student").toString();//解析字段
if (sc.property("student").isArray()) //解析数组
{
QScriptValueIterator it(sc.property("student"));
while(it.hasNext())
{
it.next();
if (!it.value().property("Name").toString().isEmpty())
{
qDebug() << "Name :" << it.value().property("Name").toString();
qDebug() << "Math :" << it.value().property("Math").toString();
qDebug() << "Chinese :" << it.value().property("Chinese").toString();
}
}
}
情况二
QString strJson = "{\"department\":\"computerScience\",\"student\":[{\"Name\":\"zhangsan\",\"semester\":[{\"schoolYear\":\"1\",\"Math\":\"95\",\"Chinese\":\"84\"},{\"schoolYear\":\"2\",\"Math\":\"96\",\"Chinese\":\"85\"}]},{\"Name\":\"zhangliu\",\"semester\":[{\"schoolYear\":\"1\",\"Math\":\"85\",\"Chinese\":\"74\"},{\"schoolYear\":\"2\",\"Math\":\"86\",\"Chinese\":\"75\"}]}]}";
QScriptEngine engine;
QScriptValue sc = engine.evaluate("value=" + strJson);
qDebug() << "department:" << sc.property("department").toString();//解析字段
if (sc.property("student").isArray()) //解析数组
{
QScriptValueIterator it(sc.property("student"));
while(it.hasNext())
{
it.next();
if (!it.value().property("Name").toString().isEmpty())
{
qDebug() << "Name :" << it.value().property("Name").toString();
if(it.value().property("semester").isArray())
{
QScriptValueIterator it1(it.value().property("semester"));
while(it1.hasNext())
{
it1.next();
if (!it1.value().property("schoolYear").toString().isEmpty())
{
qDebug() << "schoolYear :" << it1.value().property("schoolYear").toString();
qDebug() << "Math :" << it1.value().property("Math").toString();
qDebug() << "Chinese :" << it1.value().property("Chinese").toString();
}
}
}
}
}
}
情况三
QString strJson = "{\"Name\":\"Root\",\"AlarmInfos\":[{\"Name\":\"测试报警1\",\"ChooseIndex\":1,\"Conditions\":[{\"Values\":[1.0,2.0,3.0,4.0]},{\"Values\":[4.0,3.0,2.0,1.0]}]},{\"Name\":\"测试报警2\",\"ChooseIndex\":2,\"Conditions\":[{\"Values\":[7.0,7.0,8.0,8.0]},{\"Values\":[9.5,9.6,10.5,10.5]},{\"Values\":[11.6,11.6,12.6,11.6]}]}]}";
QScriptEngine engine;
QScriptValue sc = engine.evaluate("value=" + strJson);
qDebug() << "Name:" << sc.property("Name").toString();//解析字段
if (sc.property("AlarmInfos").isArray()) //解析数组
{
QScriptValueIterator it(sc.property("AlarmInfos"));
while(it.hasNext())
{
it.next();
if (!it.value().property("Name").toString().isEmpty())
{
qDebug() << "Name :" << it.value().property("Name").toString();
qDebug() << "ChooseIndex :" << it.value().property("ChooseIndex").toInt32();
if(it.value().property("Conditions").isArray())
{
QScriptValueIterator it1(it.value().property("Conditions"));
int count = 0;
while(it1.hasNext())
{
it1.next();
// if (it1.flags() & QScriptValue::SkipInEnumeration)
// continue;//由于发现在遍历的时候多循环了一次,使用这个可以过滤掉这一次
if(it1.value().property("Values").isArray())
{
++count;
QScriptValue subsc1= it1.value().property("Values");//取数组
int count1 = 0;
while(subsc1.property(count1).isValid())//由于提供的数组不是 名字:值 这种格式,所以得通过索引的方式一一解析,isValid()可以将数组的有限项一一解析出来
{
qDebug() << "Conditions:" << count << "count1:" << count1 << "value" << QString::number(subsc1.property(count1).toVariant().toDouble());
count1++;
}
}
}
}
}
}
}